第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

如何繞過Scala上的類型擦除?或者,為什么不能獲得集合的類型參數(shù)?

如何繞過Scala上的類型擦除?或者,為什么不能獲得集合的類型參數(shù)?

如何繞過Scala上的類型擦除?或者,為什么不能獲得集合的類型參數(shù)?在Scala上,一個(gè)可悲的事實(shí)是,如果您實(shí)例化一個(gè)List[Int],您可以驗(yàn)證您的實(shí)例是一個(gè)列表,并且可以驗(yàn)證它的任何單個(gè)元素是否是Int,但不能驗(yàn)證它是否是List[Int],這一點(diǎn)很容易驗(yàn)證:scala> List(1,2,3) match {      | case l : List[String] => println("A list of strings?!")      | case _ => println("Ok")      | }warning: there were unchecked warnings; re-run with -unchecked for details A list of strings?!未選中的選項(xiàng)將指責(zé)直接歸咎于類型擦除:scala>  List(1,2,3) match {      |  case l : List[String] => println("A list of strings?!")      |  case _ => println("Ok")      |  }<console>:6: warning: non variable type-argument String in type pattern is unchecked since it is eliminated by erasure              case l : List[String] => println("A list of strings?!")                  ^A list of strings?!為什么,我怎么才能避開它?
查看完整描述

3 回答

?
楊魅力

TA貢獻(xiàn)1811條經(jīng)驗(yàn) 獲得超6個(gè)贊

這個(gè)答案使用Manifest-API,它在Scala2.10中被廢棄。請(qǐng)參閱下面的答案,以獲得更多最新解決方案。

Scala是使用TypeErasure定義的,因?yàn)镴ava虛擬機(jī)(JVM)與Java不同,沒有泛型。這意味著,在運(yùn)行時(shí),只有類存在,而不是其類型參數(shù)。在本例中,JVM知道它正在處理scala.collection.immutable.List,但不是將此列表參數(shù)化為Int.

幸運(yùn)的是,Scala中有一個(gè)特性可以讓您繞過它。是因?yàn)?/trans>艙單..Manifest是一個(gè)類,其實(shí)例是表示類型的對(duì)象。由于這些實(shí)例是對(duì)象,所以可以傳遞它們、存儲(chǔ)它們,并通常對(duì)它們調(diào)用方法。在隱式參數(shù)的支持下,它成為一種非常強(qiáng)大的工具。例如,以下面的例子為例:

object Registry {
  import scala.reflect.Manifest

  private var map= Map.empty[Any,(Manifest[_], Any)] 

  def register[T](name: Any, item: T)(implicit m: Manifest[T]) {
    map = map.updated(name, m -> item)
  }

  def get[T](key:Any)(implicit m : Manifest[T]): Option[T] = {
    map get key flatMap {
      case (om, s) => if (om <:< m) Some(s.asInstanceOf[T]) else None
    }     
  }}scala> Registry.register("a", List(1,2,3))scala> Registry.get[List[Int]]("a")res6: Option[List[Int]] = Some(List(1, 2, 3))scala
  > Registry.get[List[String]]("a")res7: Option[List[String]] = None

在存儲(chǔ)元素時(shí),我們也會(huì)存儲(chǔ)其中的“報(bào)表”。Manifest是一個(gè)類,其實(shí)例表示Scala類型。這些對(duì)象比JVM具有更多的信息,這使我們能夠測(cè)試完整的參數(shù)化類型。

不過,請(qǐng)注意,aManifest仍然是一個(gè)不斷發(fā)展的特征。作為其局限性的一個(gè)例子,它目前對(duì)方差一無所知,并且假設(shè)一切都是協(xié)變的。我希望一旦完成目前正在開發(fā)的Scala反射庫,它將變得更加穩(wěn)定和可靠。


查看完整回答
反對(duì) 回復(fù) 2019-06-06
?
白豬掌柜的

TA貢獻(xiàn)1893條經(jīng)驗(yàn) 獲得超10個(gè)贊

您可以使用Typeable類型類無形為了得到你想要的結(jié)果,

REPL樣本會(huì)話,

scala> import shapeless.syntax.typeable._import shapeless.syntax.typeable._

scala> val l1 : Any = List(1,2,3)l1: Any = List(1, 2, 3)scala> l1.cast[List[String]]res0: Option[List[String]] = Nonescala
> l1.cast[List[Int]]res1: Option[List[Int]] = Some(List(1, 2, 3))

這個(gè)cast在此范圍內(nèi),操作將盡可能精確地擦除wrt。Typeable實(shí)例可用。


查看完整回答
反對(duì) 回復(fù) 2019-06-06
  • 3 回答
  • 0 關(guān)注
  • 1128 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)