Конкретные классы с членами абстрактного типа - PullRequest
6 голосов
/ 22 января 2010

Учитывая следующие черты и класс.Почему это компилируется?Может ли это быть использовано для чего-то?

trait Container {
  type A
}

trait AnotherContainer[B]{
    def x(b : B) : B
}

trait Mixed extends Container with AnotherContainer[Container#A]

class Impl extends Mixed{
    def x(a : Container#A) = a 
}

new Impl().x _

scala> new Impl().x _
res0: (Container#A) => Container#A = <function>

Обновление:

class Baz { type T; }

На самом деле это функция, но я не смог ее найти: # 1753 .

Ответы [ 2 ]

3 голосов
/ 23 января 2010

В вашем примере компилятор добавляет границы типа по умолчанию >: Nothing <: Any. Во втором примере ниже показан случай, когда абстрактный тип становится пригодным для использования (если не полезен).

scala> trait T { type A >: Nothing <: Any }
defined trait T

scala> 1: T#A
<console>:6: error: type mismatch;
 found   : Int(1)
 required: T#A
       1: T#A
       ^

scala> trait T { type A >: Int <: Int }
defined trait T

scala> 1: T#A                          
res6: T#A = 1

scala> "": T#A
<console>:6: error: type mismatch;
 found   : java.lang.String("")
 required: T#A
       "": T#A
       ^
2 голосов
/ 23 января 2010

Это выглядит безобидно, если бесполезно для меня. Тип, который хочет x, не существует, поэтому вы не можете передать его методу. Полагаю, что безвредная бесполезность должна быть ошибкой времени компиляции - дело вкуса.

Если вы посмотрите на то, что на самом деле делает x, он декомпилируется следующим образом:

public java.lang.Object x(java.lang.Object);
  Code:
   0:   aload_1
   1:   areturn

Это именно то, что должен делать метод идентификации (загрузить аргумент независимо от типа, вернуть его). Вы можете написать что-то эквивалентное с гораздо меньшим количеством кода:

trait AbstractType { type T }
class Useless extends AbstractType { def identity(t: AbstractType#T) = t }

За исключением того, что ничто не имеет типа AbstractType # T, поэтому мы снова имеем бесполезность.

Если я что-то упустил.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...