Реальные классы с участниками абстрактного типа

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

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 = 

Обновление:

class Baz { type T; }

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

6
задан Thomas Jung 3 February 2010 в 15:58
поделиться

2 ответа

Это выглядит безвреден, если для меня бесполезно. Тип, который 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 }

, за исключением того, что ничего не имеет в Type AnableType # T, так что снова у нас бесполезность.

Если я чего-то не хватает.

2
ответ дан 17 December 2019 в 04:47
поделиться

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

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
       ^
3
ответ дан 17 December 2019 в 04:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: