【问题标题】:Scala - Supertype of a type parameterScala - 类型参数的超类型
【发布时间】:2012-04-11 20:29:04
【问题描述】:

在 Scala 中,我该如何做这样的事情:

def cast [Type] (x: _ >: Type, errMsg: String): Type = {
    if (x.isInstanceOf[Type]) {
        x.asInstanceOf[Type]
    } else {
        throw new Exception(errMsg) 
    }
}

x: _ >: Type(Scala 中不存在的符号)表示“x 的类型是 Type 的任何超类型”。

【问题讨论】:

  • 你的意图是什么?只打电话x.asInstanceOf[Type] 有什么区别?

标签: scala types type-systems


【解决方案1】:

试试这个:

def cast[T >: Type](x: T, errMsg: String): T = { ... }

但是,您可能需要重新考虑 Scala 中显式类型转换的必要性。

【讨论】:

  • 其实我想要它,所以“T”和“Type”都是未知的。 (我不应该使用 Type strong,我记得它似乎是一个 java 类。)
【解决方案2】:

如果 x 可以是Type 的任何超类型,那么它当然可以是Any。这完全没有限制,你可以写x : Any

在另一行,由于类型擦除,您x.isInstanceOf[Type] 将不会进行任何有用的检查。您不能检查类型参数。 (您必须确保类型信息在运行时可用。您可以通过Manifest 获取相关信息。

【讨论】:

  • 有趣。有没有办法限制直接超强类型?另外,isInstanceOf 那么有什么用呢?
  • 限制直接超类型:没办法这样做,不确定它有多大用处。 isInstanceOf 的实用性:如果参数是显式类型名称,而不是类型参数,则它可以工作。
猜你喜欢
  • 1970-01-01
  • 2021-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-24
  • 2013-05-24
  • 2014-10-06
相关资源
最近更新 更多