generics - 访问泛型函数中的对象属性

标签 generics kotlin

如何访问泛型函数中的对象属性?代码,我目前已对 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/

相关文章:

java - 与实现Iterable相关的对象类型有哪些

android - 如何在Kotlin中使用Volley正确解析此JSON响应

Java继承与泛型,如何声明一个适用于 "multiple types"继承的函数?

java - 从java方法返回不同的类型

c# - 使用泛型将对象转换为结构

android-studio - 如何防止在我的对象上使用 kotlin 扩展?

Kotlin 函数作为映射值

java - 你如何使用 gradle 的 `` exclude`` 来替换依赖项?

java - 为什么我们写 NextActivity::class.java 虽然这是一个 kotlin 类?

带有泛型重载的 Java 删除(不是覆盖)