[英]Understanding Scala type inference and extensial types
中有以下课程:
class MyClass[T <: Enum[T]](val clazz: Class[T]){
def dummy = println(clazz.toString)
}
和方法
def createMyClass(clazz: Class[_]) =
if(clazz.isEnum)
new MyClass(clazz.asInstanceOf[Class[Enum[T] forSome { type T <: Enum[T] }]]) //error
else throw new IllegalArgumentException(s"$clazz is not an enum")
但是,尽管Enum[T]
满足类型约束T <: Enum[T]
但它拒绝编译。 如果我编写Class[T forSome { type T <: Enum[T] }]
可以使用。
但是为什么在第一种情况下不起作用?
因此,只需仔细检查,我就能理解问题所在:
这有效:
def createMyClass(clazz: Class[_]) =
if(clazz.isEnum)
new MyClass(clazz.asInstanceOf[Class[T forSome { type T <: Enum[T] }]])
else
throw new IllegalArgumentException(s"$clazz is not an enum")
这不是:
def createMyClass(clazz: Class[_]) =
if(clazz.isEnum)
new MyClass(clazz.asInstanceOf[Class[Enum[T] forSome { type T <: Enum[T] }]])
else
throw new IllegalArgumentException(s"$clazz is not an enum")
这是因为类型不对齐。 MyClass需要一个“ T,其中T是Enum [T]的子类”。 您传入的是'Enum [T],其中T是Enum [T]的子类。 例如,如果您将MyClass定义为以下示例,则哪个可以互换:
class MyClass[T <: Enum[T]](val clazz: Class[Enum[T]]){
def dummy = println(clazz.toString)
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.