[英]Scala generics type mismatch
在Scala中,我正在尝试:
import scala.reflect.runtime.{universe => ru}
def foo[T <: Any]: ru.WeakTypeTag[T] = ru.weakTypeTag[String]
但这产生了我:
<console>:34: error: type mismatch;
found : reflect.runtime.universe.WeakTypeTag[String]
required: reflect.runtime.universe.WeakTypeTag[T]
def foo[T <: Any]: ru.WeakTypeTag[T] = ru.weakTypeTag[String]
怎么了 我相对确定String
应该满足T
的派生自Any
的类型约束。
我猜想String
无法绑定到T
类型参数。 在我的用例中,也可能会返回其他类型,而且我不确定在执行该函数之前,如何预先获得编译器的答案,如果这是预期的话。
您的方法foo
声明,对于任何T <: Any
,它将返回WeakTypeTag[T]
。 也就是说,如果T
是(例如) Int
,则它应返回WeakTypeTag[Int]
。 但是,您的方法总是返回WeakTypeTag[String]
,因此类型为mistmatch。
作为替代方案,您可以使用通配符,无论如何您的类型都是从Any扩展的。
def foo[T <: Any]: ru.WeakTypeTag[_] = ru.weakTypeTag[String]
通常,问题在于WeakTypeTag [T]类的定义。 它是不变定义的。 因此,您不能在协变情况下使用它。
让我们来看一个例子。
def bom[T >: String]: List[T] = List[String]() // works fine
def foo[T >: String]: WeakTypeTag[T] = ru.weakTypeTag[String] // compilation fails
我将T定义为String的任何子类型,它适用于Lists
但WeakTypeTag
用于不变的WeakTypeTag
。 您可以定义WeakTypeTag
子类型并使其协变,以便完美地工作。
trait WeakTypeTag1[+X] extends ru.WeakTypeTag {
}
def weakTypeTag1[T](implicit attag: WeakTypeTag1[T]) = attag
def foo[T >: String]: WeakTypeTag1[T] = weakTypeTag1[String] // no it's good
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.