Вот пример того, как вы можете сделать это в Kotlin, используя рефлексию (примечание: вам даже не нужна эта информация общего типа при использовании этой функции):
fun foo(t : Any) = with(t::class.java.getDeclaredField("name")) {
isAccessible = true
get(t) as String
}
with
на самом деле не требуется.Конечно, вы можете сделать это совершенно по-другому.Просто хотел показать, как это может выглядеть в Kotlin.
Я сказал что-то типа reified
в комментариях, но вам это на самом деле здесь не нужно.
Самая большая проблемаЧтобы решить вашу проблему, у вас есть анонимный тип, который в основном сужает возможные решения просто «использовать отражение»; -)
Если бы у вас был тип / интерфейс следующим образом:
interface Nameable {
val name : String
}
тогда вы можете изменить свой foo
метод на:
fun foo(t : Nameable) = t.name
и вызов его приведет к:
foo(object : Nameable {
override val name = "Foo"
}
Но, тем не менее, это не C ++ -шаблон, и вам придется создавать множество соответствующих интерфейсов, если вы хотите быть полностью динамическими, и вам придется использовать их при создании анонимных типов и т. д. pp.