我有一个打印参数 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 <: A
,B1 >: B
。
所以对于
def bar: Int = {
printType("something")
}
printType
可能会返回Nothing
.
当编译器无法推断出某种类型的T
时,知道L <: T <: U
它得出的结论是T = L
。现在是Nothing
.