2016-11-07 14 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]のサブクラスです。あなたはTをEnum [T]のサブクラスである 'Enum [T]'を渡しています。たとえば、MyClassを次のように定義した場合、どのスワップワークが有効になるのですか?

class MyClass[T <: Enum[T]](val clazz: Class[Enum[T]]){ 
    def dummy = println(clazz.toString) 
}