2013-09-05 3 views
1

У меня есть следующие классы:Ковариантного типирование в методе парах

abstract class Record {} 

class Record1 extends Record {} 

class Record2 extends Record {} 

class MyTable[T <: Record : Manifest] extends externalLibrary.Table[T] { 
    def method {} 
} 

object MyTable1 extends MyTable[Record1] {} 

object MyTable2 extends MyTable[Record2] {} 

И теперь я пытаюсь принять любой MyTable подкласса в качестве параметра метода

def testMethod[T <: MyTable[Record]](t: T) { 
    t.method 
} 

val test = method(MyTable1) 

Это производит ошибку, MyTable1 делает не соответствует T. Если я изменю метод на [T >: MyTable[Record]], тогда это удовлетворит проверку типа в вызывающей точке, но, конечно, я больше не могу получить доступ к t.method. Как я могу исправить эту проблему?

ответ

3

Вы делаете классы ковариантны с дисперсией аннотацией на сайте декларации:

class MyTable[+T <: Record : Manifest] 
+0

Спасибо, я попробовал, что и раньше, но получил «Т инвариантный» ошибку, поэтому, когда я увидел свой ответ, который я посмотрел вокруг для решения и завершил изменение методов 'def method (t: T)' 'def method [U>: T] (u: U)', которые исправили ошибку –