Scala コンパイラーがパス依存型に対する次の制限を推論できない理由を理解しようとしています。
trait MyTrait
class MyTraitImpl extends MyTrait
trait MyTrait2[A <: MyTrait] {
type MyTraitType = A
}
class MyTrait2Impl[A <: MyTrait] extends MyTrait2[A]
val obj: MyTrait2[_] = new MyTrait2Impl[MyTraitImpl]
def myMethod[A <: MyTrait](t2: MyTrait2[A]) = println("Hi!")
myMethod[obj.MyTraitType](obj)
// <console>:14: error: type arguments [obj.MyTraitType] do not conform to method myMethod's type parameter bounds [A <: MyTrait]
// myMethod[obj.MyTraitType](obj)
私にとっては、直観的には、MyTraitTypea のサブクラス以外のものになることはできません。ある場合は、例を挙げていただくか、このコード スニペットのどこが間違っているかを教えていただけますか?MyTraitAMyTrait2
これが Scala コンパイラの制限である場合、型システムを使用してこれを達成する方法を誰か教えてもらえますか? ご了承ください:
- 私は
MyTrait物を持っていませんしmyMethod、受け取っていません。 - ;
myMethodの具体的な型を知る必要はありません。A知る必要があるのは、Aそれが のサブタイプでMyTraitあり、t2でパラメータ化されていることだけAです。 - のアンダースコア
objは意図的なものです。どこで を呼び出すmyMethodか、の具体的な型がわからないA(そうでなければ問題にならない); - 変更する必要のないソリューションを好みます
myMethod。