【问题标题】:Can I check for variable is Type T?我可以检查变量是 T 型吗?
【发布时间】:2018-07-02 05:05:53
【问题描述】:

我打算设置我的协调器,只要它是 T 型发送。

interface ViewSurface<T : Coordinator> {
    var coordinator: T

    fun setCoor(coordinator: Coordinator) {
        if (coordinator is T) {
            this.coordinator = coordinator
        }
    }
}

以上代码投诉Cannot check for erased type: T。我怎样才能改变以获得正确的语法,同时实现我想要的?

【问题讨论】:

  • 可能与“标准 Java”的方式相同,由于 .. 类型擦除,这是迂回的。请参阅stackoverflow.com/q/339699/2864740 了解发生这种情况的方式/原因。但为什么不只接受coordinator: T

标签: generics kotlin type-erasure type-systems


【解决方案1】:

因为在运行时,泛型类型参数全部消失(擦除),运行时无法真正检查 coordinator is T 是否,因为它不知道 T 是什么。

与其在分配之前检查coordinator 的类型,不如将参数类型从Coordinator 更改为T,以便编译器 可以保证coordinator 始终是可分配给界面中的coordinator 属性?

fun setCoor(coordinator: T) {
    this.coordinator = coordinator
}

如您所见,setCoor 方法并不是真正需要的。您可以正常设置属性:

coordinator = ...

【讨论】:

  • 虽然这[可能]在这种情况下有效,并且这种使用泛型的类型声音方法总体上是一种改进,但它并不能回答基本问题:} 有时一个真的确实 想要访问“T 的类型”(即使这种类型本身会导致“不安全”演员表)。 Reified generics 使这变得微不足道,Java/Kotlin(没有这样的)需要采用稍微不同的方法..
  • @user2864740 我认为有很多答案已经在 J​​ava 中解决了这个问题。喜欢thisthis。如果您认为需要 kotlin 版本。您可以发布问题并自己回答。 :)
  • 我确实认为 Kotlin 版本会很方便。这 OP 要求的,即使是 XY 问题。 Y 可能是正确的,但 X 仍然被问到。
猜你喜欢
  • 2011-10-25
  • 2017-02-03
  • 2010-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-13
  • 2013-07-19
相关资源
最近更新 更多