为什么 T 的 TypeTag 在我没有明确指定类型时为无?

  • 本文关键字:类型 TypeTag scala generics
  • 更新时间 :
  • 英文 :


我有一个打印参数 T 类型的函数。当它被foo调用时,它会打印Int。当它被bar调用时,它会打印Nothing。当编译器清楚地发现T需要是一个Int时,为什么它会打印Nothing,因为我们返回的是printType()的结果,而bar的返回类型需要是一个Int

代码编译并运行,但类型打印不正确。

def printType[T](input: String)(implicit tag: TypeTag[T]): Option[T] = {
val t = typeOf[T]
println(s"$t")
...
}
def foo: Int = {
printType[Int]("something") // prints Int
}
def bar: Int = {
printType("something")  // prints Nothing
}

也许你的意思

def printType[T](input: String)(implicit tag: TypeTag[T]): T = ...

而不是

def printType[T](input: String)(implicit tag: TypeTag[T]): Option[T] = ...

如果你有办法

def myMethod(a: A): B = ???

你使用它

val a: A1 = ???
val b: B1 = myMethod(a)

那么A1 = A就没必要了,B1 = B,可以A1 <: AB1 >: B

所以对于

def bar: Int = {
printType("something") 
}

printType可能会返回Nothing.

当编译器无法推断出某种类型的T时,知道L <: T <: U它得出的结论是T = L。现在是Nothing.

最新更新