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)
私にとっては、直観的には、MyTraitType
a のサブクラス以外のものになることはできません。ある場合は、例を挙げていただくか、このコード スニペットのどこが間違っているかを教えていただけますか?MyTrait
A
MyTrait2
これが Scala コンパイラの制限である場合、型システムを使用してこれを達成する方法を誰か教えてもらえますか? ご了承ください:
- 私は
MyTrait
物を持っていませんしmyMethod
、受け取っていません。 - ;
myMethod
の具体的な型を知る必要はありません。A
知る必要があるのは、A
それが のサブタイプでMyTrait
あり、t2
でパラメータ化されていることだけA
です。 - のアンダースコア
obj
は意図的なものです。どこで を呼び出すmyMethod
か、の具体的な型がわからないA
(そうでなければ問題にならない); - 変更する必要のないソリューションを好みます
myMethod
。