簡體   English   中英

存在類型的類型推斷

[英]Type inference with existential type

我有一個通用特征SomeTrait定義為:

trait SomeTrait[T] {
  def foo(t: T): String
}

和方法barqux一樣:

def bar[T](t: SomeTrait[T]): T
def qux: List[SomeTrait[_]]

我無法控制以上內容。 我正在嘗試對qux返回的列表進行操作,就像這樣

qux map { x => x.foo(bar(x))}

但是,編譯器抱怨類型不匹配。 據我所知,這應該沒問題。

我嘗試添加一個通用方法(簽名[T](SomeTrait[T])String ),然后調用它來完成工作,但是編譯器仍然抱怨。 可以這樣處理:

qux map { x =>
  val casted = x.asInstanceOf[SomeTrait[T forSome { type T }]] // !!!
  casted.foo(bar(casted))
}

但這更加令人困惑,因為x已經具有SomeTrait[_]類型和SomeTrait[T forSome { type T }]意味着同一件事。 我知道的唯一區別是,前者是后者的簡寫,后者使編譯器創建自己的綜合名稱。 我希望有更好的方法可以做到這一點。 我已經看到了這個問題,但是我認為它不適用。

正確的方法是使用類型變量為T命名:

qux map { case x: SomeTrait[t] => x.foo(bar(x)) }

這樣,編譯器就知道bar(x): t ,因此它是x.foo的可接受參數。

或者,也可以將foobar組合為一個方法(請記住,方法可以是局部的,因此您可以在需要的地方定義它):

def fooOfBar[T](x: SomeTrait[T]) = x.foo(bar(x))
qux map { fooOfBar(_) }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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