Пазл Абстрактные типы - PullRequest
       39

Пазл Абстрактные типы

3 голосов
/ 25 августа 2011

Данный класс A равен:

class A {
  type R
}

Почему следующий код компилируется (и выполняется тоже)?

val a = new A
println(a)

Разве A не должен быть абстрактным?

Ответы [ 3 ]

7 голосов
/ 25 августа 2011

A не является абстрактным. Если бы это было абстрактно, то это выглядело бы так:

abstract class A {
  type R
}

или

trait A {
  type R
}

Так вот, я не могу найти это в спецификации (в последнее время мне не очень повезло с поиском чего-то там), но я видел это раньше. Если тип не используется, то он выглядит так, как будто он не оценен, что означает, что отсутствие его полноты не является проблемой.

Если вы действительно хотите, чтобы A был абстрактным, сделайте так, используя вместо этого одно из приведенных выше определений.

2 голосов
/ 26 августа 2011

Просто уточните комментарий @ alex22:

scala> trait T { type R; def foo(r: R) = r }
defined trait T

scala> new T{}.foo("")
<console>:12: error: type mismatch;
 found   : java.lang.String("")
 required: _6.R where val _6: java.lang.Object with T
              new T{}.foo("")
                          ^

scala> new T{ type R = String }.foo("")
res37: java.lang.String = ""
0 голосов
/ 26 августа 2011

Кажется, что абстрактный тип имеет значение по умолчанию Nothing.

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