Anonymous inner class?


#1

Given following class:

trait Foo {
    fun hi(): String
}

class MyClass() {   val foo = InnerFoo()      inner class InnerFoo : Foo {   override fun hi(): String = "hello"   }    }

Is it possible to make the inner class (Foo) anonymous?

class MyClass() {   val foo = inner object: Foo {   //COMPILE ERROR   override fun hi(): String = "hello"   }    }


#2

Hello! If i correctly, understand what you want, then just removing inner word is enough:

trait Foo {
    fun hi(): String
}

class MyClass() {

  val myField = “field”

  val foo = object : Foo {
  override fun hi(): String = “hello, outer field is $myField
  }
}

fun main(args: Array<String>) {
  println(MyClass().foo.hi())
}


#3

Aleksey,

Your example is working, but according to kotlin documentation it shouldn’t.

A class may be marked as inner to be able to access members of outer class. Inner classes carry a reference to an object of an outer class:

The foo class in your example is not marked as “inner”, but it has access to outer class members. Is it a bug or the documentation is outdated?


#4

It's object expression which is more general analogous to java's anonymous inner classes and since it is expression it closures `this` reference, so it's neither bug or outdated documentation. But i think someone from Kotlin team will provide more formal explanation


#5

Although object expressions are compiled into classes, they are not strictly classes from the language point fo view, and the aforementioned extract from the docs does not apply to them


#6

Thanks for the clarificatoin.