Why ``` object A { sealed class B cla...
# getting-started
v
Why
Copy code
object A {
    sealed class B
    
    class C : B()
    class D : B()
}
gives
cane be inherited only by nested classes
, but
Copy code
sealed class B
    
class C : B()
class D : B()
works fine?
w
Looking at the bytecodes decompiled: My example:
Copy code
object AsasA1 {
    sealed class AsasB1

    class AsasC1 : AsasB1()
    class AsasD1 : AsasB1()
}

sealed class AsasB2

class AsasC2 : AsasB2()
class AsasD2 : AsasB2()
The second case generates:
Copy code
public abstract class AsasB2 {
   private AsasB2() {
   }

   // $FF: synthetic method
   public AsasB2(DefaultConstructorMarker $constructor_marker) {
      this();
   }
}
while the other one generates:
Copy code
public abstract static class AsasB1 {
   }
The one inside the
object
do not generates the constructor. Why? Don't know 😞
a
The ability to extend sealed classes with not nested classes was added in kotlin 1.1
you can still do this the old way
class A { sealed class B { class C : B() class D : B() } }
v
I am on 1.3
a
something obviously is not working as expected…
why do you need to defined the sealed class hierarchy inside a singleton?
quote: “Now you can define subclasses of a top-level sealed class on the top level in the same file, and not just as nested classes of the sealed class”
so what you are trying to achieve can only be done in top-level classes
object A { sealed class B { class C : B() class D : B() } }
the workaround is to use nested classes inside your sealed class
v
So it is probably a bug?
a
it’s a documented feature, check link above
😛
i
It's a known limitation that we're considering to lift later: https://youtrack.jetbrains.com/issue/KT-13495
👍🏼 3
v
Thanks, voted!