1

理解できないこのタイプの不一致に遭遇しました:

error: type mismatch;
found   : org.fluentlenium.core.domain.FluentList[_<:org.fluentlenium.core.domain.FluentWebElement]
required: org.fluentlenium.core.domain.FluentList[?0(in value $anonfun)] where type ?0(in value $anonfun) <: org.fluentlenium.core.domain.FluentWebElement
Note: org.fluentlenium.core.domain.FluentWebElement >: ?0, but Java-defined class FluentList is invariant in type E.
You may wish to investigate a wildcard type such as `_ >: ?0`. (SLS 3.2.10)

実際、「見つかった」値は次のタイプであることが正確です。

org.fluentlenium.core.domain.FluentList[_<:org.fluentlenium.core.domain.FluentWebElement]=> バリアント型パラメータ

「見つかった」値がバリアント型パラメーターである、このような状況を表すことができませんでした。私はこの簡単なスニペットコードを試しました:

public class CarList<E extends Car> implements Collection<E> { // written in Java
   //overriden methods from Collection here
}

public class Car{} // written in Java

public Ferrari extends Car{} //written in Java

object Main extends App {  

   val carList: CarList[Car] = new CarList[Car]

   val l: CarList[Ferrari] = carList

}

発生するコンパイルエラーは非常に似ています:

error: type mismatch;
found   : app.CarList[app.Car]     //but in this case, logically it's an invariant type: Car
required: app.CarList[app.Ferrari]
Note: app.Car >: app.Ferrari, but Java-defined class CarList is invariant in type E.
You may wish to investigate a wildcard type such as `_ >: app.Ferrari`. (SLS 3.2.10)
val l: CarList[Ferrari] = carList
                                     ^

コードスニペットを変更して正確に終了する方法:

  • のものと同じ種類のエラーFluentList(「見つかった」値のバリアント型パラメーターを正確にする):
    found : app.CarList[_ :> app.Car]
  • コンパイラからの同じアドバイスで:
    You may wish to investigate a wildcard type such as _ >:

問題の原因が何であるかを理解できるようにするには?

4

1 に答える 1

0

あなたのJavaの例では、2つのことを逆にしたようです。車のリストをフェラーリのリストに割り当てることはできません。

それを念頭に置いて、スニペットを次のように解釈しました。

class CarList[E <: Car]

class Car
class Ferrari extends Car

object Main extends App {

  val carList = new CarList[Ferrari]

  // this now throws a compiler error
  val l: CarList[Car] = carList
}

コンパイルエラーは次のとおりです。

type mismatch;
found: CarList[Ferrari] required: CarList[Car]
Note: Ferrari <: Car, but class CarList is invariant in type E.
You may wish to define E as +E instead.

したがって、コンパイラは実際に私たちを助けてくれます。この定義:

class CarList[E <: Car]

を拡張するもののリストがあることをコンパイラに伝えますCar

CarList[Ferrari]ただし、それはコンパイラーにも拡張されていることを伝えませんCarList[Car]Eコンパイラにそうであることを伝えるには、 で共変にする必要があり+ます。

したがって、エラーを解決するには、次の 2 つのことを行うことができます。

  1. として定義CarListCarList[+E]、それらの内容は気にしないとしますが、A拡張するB場合は拡張CarList[A]すると見なすことができますCarList[B]
  2. として定義CarListCarList[+E <: Car]、1 と同じことを言いEますCar

分散に関するこの質問は、追加情報を提供する可能性があります。

于 2013-02-20T21:52:50.340 に答える