2010-07-20 4 views

ответ

10

Вы можете иметь общий метод, но реализация абстрактного универсального метода сам должен быть универсальным:

scala> trait T { def p[A,B]: Map[A,B] } 
defined trait T 

scala> new T { def p[S, T] = Map[S, T]() } 
res13: java.lang.Object with T = [email protected] 

Помните, что параметры неограниченного типа универсально оцениваются. Вы говорите, что p определяется для всех пар типов без исключения или ограничения. Многие привязки S и T несовместимы с Int, поэтому вы не можете просто вернуть Map [Int, Int], где требуется Карта [S, T].

Обновление: Re: «Итак, у меня могут быть не общие реализации общих абстрактных классов и черт, а не общих методов?»

Вы можете иметь необщего реализацию общих абстрактных классов в этом смысле:

abstract class C[A, B, C] { /* ... */ } 
class D extends C[Int, String, Boolean] { /* ... */ } 

Или как это:

class E extends C { /* ... */ } 

Хотя это одна та же, как:

class E extends C[Nothing, Nothing, Nothing] { /* ... */ } 

И Nothing - это необитаемый тип в Scala.

Но вы не можете реализовать абстрактный общий метод с помощью не общего метода

+0

Итак, у меня могут быть не общие реализации общих абстрактных классов и признаков, но не общих методов? –

4

Я предполагаю, что вы хотите сделать это:

scala> trait T[A,B] { def p: Map[A,B] } 
defined trait T 

scala> new T[Int,Int] { def p = Map(0 -> 1) } 
res0: java.lang.Object with T[Int,Int] = [email protected] 
+2

Почему? Могу ли я иметь общий метод в T? –

+1

Levi, это не имеет смысла. Если метод параметризуется с помощью A, B, то значения А и В будут меняться при каждом вызове: def p [A, B]: Карта [A, B] = Карта (0 -> 1) Но выше метод не может вернуть ничего, кроме Map [Int, Int], поэтому, если бы я назвал ваш метод следующим: val a = p [String, Boolean]() Какой смысл это сделать? Конечно, у вас могут быть параметры типа для ваших методов, но ваш случай использования бессмыслен. –

Смежные вопросы