了解Scala类型推断和扩展类型

时间:2016-11-07 14:12:41

标签: scala 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] }],它就有效。

但为什么第一种情况不适用呢?

1 个答案:

答案 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)
}