我有以下课程:
class MyClass[T <: Enum[T]](val clazz: Class[T]){
def dummy = println(clazz.toString)
}
以及应该创建MyClass
个对象的以下方法:
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[_]
对象不满足类型边界。有没有办法告诉编译器我们实际上有一个代表Class
的{{1}}。
在Java中,我只会进行转换,但我认为Scala有更好的方法来处理这些事情。
BTW,
Enum
不起作用
我无法更改方法的签名。
答案 0 :(得分:1)
在T
上使用相同的类型约束声明您的方法然后它将编译
def createMyClass[T <: Enum[T]](clazz: Class[T]) =
if(clazz.isEnum) new MyClass(clazz)
else throw new IllegalArgumentException(s"$clazz is not an enum")
Scala REPL
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
答案 1 :(得分:1)
我不能改变方法&#39;签名。
如果需要,可以使用存在类型
进行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
应该是,如果不是总是最后的,那么接近它。