Невозможно создать черту - PullRequest
2 голосов
/ 20 июля 2010

Я пытаюсь определить простую черту следующим образом:

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

scala> new T { def p = Map(0 -> 1) }
<console>:7: error: object creation impossible, since method p in trait T of type [A,B]Map[A,B] is not defined
       new T { def p = Map(0 -> 1) }
       ^

Как получилось?

Спасибо

Ответы [ 2 ]

10 голосов
/ 20 июля 2010

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

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 = $anon$1@1f74864

Помните, что параметры неограниченного типа универсально определены количественно.Вы говорите, что p определено для всех пар типов без исключения или ограничения.Многие привязки S и T несовместимы с Int, поэтому вы не можете просто вернуть карту [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.

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

4 голосов
/ 20 июля 2010

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

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] = $anon$1@2f1261b1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...