4
Manifest上的訪問似乎從scala中的特性來說很棘手。如何在Scala中使用參數化特徵的反射?
這段代碼如何在scala中編譯?
trait SomeTraitOf[+A] {
def newInstanceOfA : A = /* necessary code to make it work */
}
(相關,它工作正常的parametized類:
class SomeTraitOf[A : Manifest] {
def newInstanceOfA(implicit m : Manifest[A]) : A =
m.erasure.newInstance.asInstanceOf[A]
}
,但不與協變類型參數(+ A))
編輯:真正的東西
sealed trait RootPeerProxy[+A] extends Proxy {
def peer: A
def self = peer
def peerManifest[B >: A](): Option[Manifest[B]]
private[scalavaadin] def newInstance() : Option[A]
}
trait PeerProxy[+A] extends RootPeerProxy[A] {
override def peerManifest[B >: A](): Option[Manifest[B]]
override def peer(): A = this.newInstance match {
case None => {throw new IllegalStateException("oups")}
case Some(a) => a
}
private[scalavaadin] override def newInstance() : Option[A] = peerManifest map { m => m.erasure.newInstance.asInstanceOf[A] }
}
由於性狀不能提供參數化特徵的清單,所以實現特徵的類應該是bu我不明白。
'類SomeTraitOf [+ A:清單] { 高清newInstanceOfA [B> :A](implicit m:Manifest [B]):B = m.erasure.newInstance.asInstanceOf [B] }'工作正常,但特質不帶有明顯的信息。 – jwinandy
好吧,我明白了,我不能直接在特性中使用它,例如'def peer():A = newInstance',但它在外面工作正常。 – jwinandy
我不確定我是否理解你的問題,但我更新了我的答案並提供了更多信息。 –