如何访问泛型函数中的对象属性?代码,我目前已对 error: unresolved reference: name
提出 claim .我怎样才能让它工作?
有where
关键字,但我没有找到太多关于它的信息。
fun <T> foo(t:T): String{
return t.name
}
foo(object {
val name = "Foo"
})
C++ 等价物:
struct {
int name{10};
}a;
template<typename T>
int foo(T&t) {
return t.name;
}
foo(a);
最佳答案
这是一个示例,您可以如何在 Kotlin 中使用反射(注意:您甚至不需要使用该函数的方式在此处提供泛型类型信息):
fun foo(t : Any) = with(t::class.java.getDeclaredField("name")) {
isAccessible = true
get(t) as String
}
with
并不是真正需要的。你当然可以完全不同。只是想展示这在 Kotlin 中的样子。我说了一些
reified
输入评论,但你实际上并不需要它。解决您的问题的最大问题是,您有一个匿名类型,这基本上将可能的解决方案缩小到“使用反射”;-)
如果您有如下类型/接口(interface):
interface Nameable {
val name : String
}
那么你可以改变你的
foo
方法:fun foo(t : Nameable) = t.name
并调用它,将导致:
foo(object : Nameable {
override val name = "Foo"
}
但是,它仍然不是 C++ 模板,如果您想要完全动态,则必须创建许多适当的接口(interface),并且在创建匿名类型等时必须使用它们。
关于generics - 访问泛型函数中的对象属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53412248/