2016-11-07 142 views
1

在有下面的類:理解Scala的類型推斷和extensial類型

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] }],它會起作用。

但爲什麼它不適用於第一種情況?

回答

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