В Scala v 2.7.7
У меня есть файл с
class Something[T] extends Other
object Something extends OtherConstructor[Something]
Это бросает ошибку:
класс Что-то берет параметры типа
объект Что-то расширяет OtherConstructor [Что-то] {
Однако я не могу сделать этого
object Something[T] extends OtherConstructor[Something[T]]
Это бросает ошибку:
ошибка: ';' ожидаемый, но' [' найденный.
Действительно ли возможно отправить параметры типа для возражения? Или если я изменяю и просто использую Otherconstructor
Спасибо за ответы.
object Something extends OtherConstructor[Something[_]]
, похоже, компилируется (хотя мне еще предстоит запустить / проверить это: -))
@oxbow_lakes, я следовал вашему совету - избегать системы типов - до сих пор, но Я должен это сделать !!! Я изучал экзистенциальные типы, стирание типов и все такое, но это все еще не в моих силах: - (
Вы можете использовать:
object Something extends OtherConstructor[Something[_]]
Конечно, вы будете ограничены наличием экзистенциального типа без верхней границы вместо конкретного типа. Это решение может не иметь смысла, и вам может понадобиться один объект для каждого конкретного типа T
, для тех T, которые вас волнуют, например
object StringSomething extends OtherConstructor[Something[String]]
Но это имеет (возможный) недостаток, заключающийся в том, что StringSomething
не является сопутствующим объектом Something
.
Однако я бы посоветовал не начинать возиться с проектированием общих API (особенно самореференциальных, подобных приведенному выше), если вы действительно, действительно не знаете, что делаете . Это почти наверняка закончится слезами, и существует множество CORE Java API, которые ужасны из-за того, как были добавлены дженерики ( RowSorter
API на JTable
является одним из примеров)
Объект должен иметь конкретный тип. Конструкция объекта Scala не является исключением из этого правила.
Допустимое определение:
object Something extends OtherConstructor[Something[T]] { }
, где T
- некоторый конкретный тип .