我想知道如何修復型別擦除警告,即使我添加了ClassTag?有沒有不添加像 TypeTag 這樣的額外庫的簡單修復?
import scala.reflect.ClassTag
class Node
class C_PHYLUM[T]
class I_PHYLUM[T](name: String)
trait C_SEQUENCE[T1,T2]
class T_SEQUENCE[T]
class M_SEQUENCE[T_ElemType <: Node : ClassTag](name : String, t_ElemType:C_PHYLUM[T_ElemType])
extends I_PHYLUM[T_SEQUENCE[T_ElemType]](name)
with C_SEQUENCE[T_SEQUENCE[T_ElemType],T_ElemType]
{
type T_Result = T_SEQUENCE[T_ElemType];
def u__op_AC(x:Any) : Option[(T_Result,Seq[T_ElemType])] = x match {
case x : T_Result => Some((x,toList(x)));
case _ => None
};
def toList[T](x: T): Seq[T_ElemType] = Seq(x.asInstanceOf[T_ElemType])
}
警告:
warning: abstract type T_ElemType in type pattern T_SEQUENCE[T_ElemType] (the underlying of M_SEQUENCE.this.T_Result) is unchecked since it is eliminated by erasure
case x : T_Result => Some((x,toList(x)));
可復制的例子
uj5u.com熱心網友回復:
型別擦除是泛型在 JVM 上實作方式的結果。這意味著在運行時,您將無法區分例如 aList[Int]和 a之間的區別List[String];所有運行時都知道您有一個List. 了解您是在期待[Int]還是[String]僅在編譯時。
在你的情況下,你有T_SEQUENCE[T_ElemType]- 所以給定一些 type 的物件Any,你可以isInstanceOf用來檢查你是否有 some 的實體T_SEQUENCE,但不知道它的型別引數是什么。
您可以假設您的方法永遠不會收到T_SEQUENCE帶有錯誤型別引數的 a ,并使用它來做
case x : T_SEQUENCE[_] => Some((x.asInstanceOf[T_Result],toList(x.asInstanceOf[T_Result])))
或者,假設你的T_SEQUENCE類有某種.map方法可以讓你轉換內部的值,你可以做一些委托給ClassTag你帶來的東西,例如
// I'll assume a method like this exists:
def transformTSeq[A, B](tSeq: T_SEQUENCE[A], f: A => Option[B]): Option[T_SEQUENCE[B]]
// inside your match
case x: T_SEQUENCE[_] =>
transformTSeq(x, value => {
implicitly[ClassTag[T_ElemType]].unapply(value)
})
case _ =>
None
PS去掉那些分號
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/372779.html
