[英]Scala generic Class[_] parameter
我有以下課程:
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[_]
對象。 有沒有辦法告訴編譯器我們實際上有一個表示Enum
的Class
。
在Java中,我只是進行強制轉換,但是我認為Scala有更好的方法來處理此類問題。
順便說一句,
new MyClass(clazz.asInstanceOf[Class[Enum[_]]])
也不起作用
我無法更改方法的簽名。
在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")
斯卡拉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
我無法更改方法的簽名。
您可以根據需要使用存在性類型進行操作
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
應該是,如果不總是萬不得已,則應接近它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.