有以下课程:
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] }]
,它就有效。
但为什么第一种情况不适用呢?
答案 0 :(得分:2)
所以只是仔细检查我理解这个问题:
这有效:
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)
}