簡體   English   中英

Scala通用Class [_]參數

[英]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[_]對象。 有沒有辦法告訴編譯器我們實際上有一個表示EnumClass

在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM