2016-11-03 3 views
0

나는 다음 클래스가스칼라 일반적인 클래스 [_] 매개 변수

def createMyClass(clazz: Class[_]) = 
    if(clazz.isEnum) 
    new MyClass(clazz) //compile error is here 
    else throw new IllegalArgumentException(s"$clazz is not an enum") 

를하지만 컴파일을 거부합니다. 사실, 타입 경계를 채우지 않는 Class[_]의 객체를 전달합니다. 컴파일러에게 실제로 ClassEnum을 나타내는 지 알 수있는 방법이 있습니까?

자바에서는 캐스팅 만 할 것이지만 스칼라는 그런 것들을 다루는 더 좋은 방법이 있다고 생각합니다. 나는 방법 '서명을 변경할 수 없습니다

new MyClass(clazz.asInstanceOf[Class[Enum[_]]]) 

이 작동하지 않는 BTW

, 하나

.

답변

1

나는 방법 '서명을 변경할 수 없습니다

def createMyClass[T <: Enum[T]](clazz: Class[T]) = 
    if(clazz.isEnum) new MyClass(clazz) 
    else throw new IllegalArgumentException(s"$clazz is not an enum") 

스칼라 REPL를 컴파일 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") 

를 사용하여, 그것을 할 수 있습니다하지만 실제로 필요가 있다면 당신은 신중하게 고려해야합니다. asInstanceOf은 항상 최후의 수단이 아니더라도 가까운 곳에 있어야합니다.

+0

우수, 많이 감사합니다! – stella

1

는이

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

scala> def createMyClass[T <: Enum[T]](clazz: Class[T]) = 
    if(clazz.isEnum) 
     new MyClass(clazz) else throw new IllegalArgumentException(s"$clazz is not an enum") 
defined function createMyClass 
관련 문제