2017-05-31 3 views
1

これはなぜ型付けされた変数の使用は、このコードを動作させるん

trait SomeTrait { 
    type T 
def write2(s: String): T 
} 

case class C() extends SomeTrait { 
    type T = String 
    override def write2(s:String): T = s } 

に動作します。しかし、これは私の推論に

trait SomeTrait { 
    def write2[T](s: String): T 
} 

case class C() extends SomeTrait { 
override def write2(s: String): String =s } 

ない、彼らは同様の..seem。なぜコンパイラは「メソッドは何もオーバーライドしません」というエラーをなぜ与えるのですか?この仕事をする方法はありますか?

+3

あなたのタイプパラメータと基本特性を異なるように名前を付けてください。混乱は少し少なくなります。 –

+0

..更新、ありがとう – user7938511

答えて

1

これは、コンパイルされます。

trait T { 
    def write2[T](s: String): T 
} 

case class C() extends T { 
    override def write2[T](s: String): T =s.asInstanceOf[T] 
} 

write2はT、ないString(2番目のオーバーライドが動作しない理由を、したがってその理由と醜いキャストのために上記のコードで必要)

+0

これはコンパイルされますが、全く役に立たない方法ではありません。 –

+0

@AlexeyRomanov目標は「有用」ではなく、なぜ 'T'型が' String'型でないのかを説明することでした.OPのオーバーライドはコンパイルされません –

3

返しますあなたの2つ目のスニペットでの特性定義は、あるタイプTのメソッドwrite2を持っていなければならないが、タイプパラメータTをとるメソッドwrite2を持っていなければならないという意味ではありません。

trait T { 
    def write2[T](s: String): T 
} 

この特性を利用して、いくつかのクライアントを考えてみましょう:あなたは値v: SomeTraitを持っている場合、あなたはこの定義を使用する場合は

val stringed: String = v.method2[String]("foo") 
val inted: Int = v.method2[Int]("foo") 
3

を行うことができるはず、ということを意味

。たとえば:

def doSomething(t: T): Unit = { 
    val s: String = t.write2[String]("hello") 
    val n: Int = t.write2[Int]("world") 
    val d: Double = t.write2[Double]("!") 
    println(s + n.toString + d.toString) 
} 

私は、sの値は、N、およびdはどうなるかわからないが、理論的には、コンパイラの視点からの形質の完全に有効な使用法、あろうこと。そのため、のすべてのの可能なタイプTに対して有効な動作を提供する必要があります。

trait T2 { 
    type T 
    def write2(s: String): T 
} 

あるいは:

trait T3[T] { 
    def write2(s: String): T 
} 

そして、発信者がそれを使用する場合:

def doSomething(t: T2): Unit = { 
    val x = t.write2("hello") // always returns type t.T 
} 

def doSomething[T](t: T3[T]): Unit = { 
    val x = t.write2("hello") // always returns type T 
} 

あなた一度、返すことができる唯一の可能なタイプがあります

はにことを比較しますその特性の特定のインスタンスを持っている。したがって、そのメソッドをオーバーライドするには、その1つのタイプのビヘイビアをオーバーライドするだけです。

+0

良い説明 – user7938511

関連する問題