-1
は、コードの構造です:パラメータ化されたメソッドを参照する方法は?ここ
trait Foo[T <: Foo[_]] {
def makeACopy[T](attr01_p: Option[String], ...): T
...
}
case class Bar extend Foo[Bar] {
def makeACopy[Bar](attr01_p: Option[String], ...): org.myapp.domain.model.Bar = copy(attr01 = attr01_p, ...)
...
}
今、別のクラスのメソッドは、メソッドmakeACopyを参照する必要があります。
class Qux(...){
...
private def myMethod[T <: Foo](id: Long, getter: Long => Option[T], ...): Option[T] = {
val b = getter(id)
b match {
case Some(bar) => bar.makeACopy[T](...) // <== It isn't right
case None => ...
}
}
私はfooとのIntelliJ IDEAのサブタイプがライン文句を言わないので、私はすでに、パラメータを指定するもののmakeACopyメソッドを呼び出すための準拠エラーを取得:
value makeACopy is not a member of type parameter T
はなぜ?そしてそれを解決する方法は?
また、私はなぜ、バーにmakeACopyの返されたデータ型のフルパスを持たなければならないのか分かりません。そうしないと、IDEは返された型の不一致を訴えるでしょう。
あなたは 'Foo'sと' Bar'sで失われなければならない:)あなたがパッケージ名を指定する必要が理由をその戻り値の型は、おそらく複数の 'Bar'があることを示唆しています。また、 '' Foo'はパラメータ化が必要なので、 '' T [:Foo] 'はコンパイルすべきではありません。その行にエラーがない場合、範囲内に別の' Foo'があります。 – Dima
あなたのご意見ありがとうございます。それは私の場合ではないようです。私はその名前のクラスのうちの1つしか見つけることができません。 – TeeKai
何でも...どんな場合でも、 'Foo [T <:Foo]'は有効なコードではありません。intellijは混乱しているかもしれません。あなたは前進する前にそれを修正する必要があります。 – Dima