Scala泛型类[_]参数

时间:2016-11-03 20:26:30

标签: scala enums

我有以下课程:

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

不起作用

我无法更改方法的签名。

2 个答案:

答案 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应该是,如果不是总是最后的,那么接近它。