2017-02-03 10 views
3

Я хочу переопределить тип-параметризованный метод, присвоив конкретный тип параметру типа, что-то вроде кода ниже.Могу ли я переопределить тип парметеризованного метода с конкретным типом в scala?

trait A { 
    def amethod[T](x: T): T 
} 
trait B extends A { 
    def amethod(x: String): String = x ++ x 
} 

Однако компилятор дает amethod overrides nothing. Я не могу поставить [String] после amethod в черте B, поскольку синтаксически это означает параметр типа String, а не тип java.lang.String. Мне интересно, как и как я могу сделать что-то подобное.

Большое спасибо.

+2

У вас есть контроль над признаком 'A'? Если это так, вы можете заставить его использовать 'T' как параметр типа и сделать' B' подтипом 'A [String]'. – Jubobs

+2

№ 'B' нарушает договор с' A'. –

+0

это отлично работает для меня .. можете ли вы объяснить, в чем проблема? 'trait A {def amethod [T] (x: T): T}; trait B extends A {def amethod [String] (x: String) = x}; класс C расширяет B {}; val c = новый C(); c.amethod ("Hello"); res5: String = Hello' –

ответ

3

amethod, как определено в черте A, является общим методом, что означает, что каждый вызов может быть применен к общим аргументам.

То, что вы пытаетесь сказать в виде B, заключается в изменении области, в которой выражается общность, перемещая ее с сайта вызова на само определение класса. Это невозможно сделать.

Как это было предложено в комментариях, если вы хотите, чтобы выразить общность в определении класса, параметр типа должен быть применен к классу, а не к методу:

trait A[T] { 
    def amethod(x: T): T 
} 

trait B extends A[String] { 
    override def amethod(x: String): String = x ++ x 
} 
2

Как объяснению комментарий, сообщающий «B разрывает контракт с A», рассмотреть этот код:

def foo(): A = new B {} // legal because B extends A 
def bar = foo().amethod[Int](0) 

Что должно произойти? Если у вас есть соблазн сказать, что он должен быть отклонен, если посмотреть на тело foo, представьте, что это абстрактный метод, и некоторый класс реализует его таким образом.