Почему Scala жалуется на незаконное наследование, когда в иерархии классов есть необработанные типы?

Я пишу обертку, которая принимает Scala ObservableBuffer и запускает события, совместимые с инфраструктурой Eclipse/JFace Databinding.

В структуре привязки данных есть абстрактный ObservableList это украшает обычный список Java. Я хотел повторно использовать этот базовый класс, но даже этот простой код не работает:

val list = new java.util.ArrayList[Int]
val obsList = new ObservableList(list, null) {}

с ошибками:

illegal inheritance; anonymous class $anon inherits different type instances of trait Collection: java.util.Collection[E] and java.util.Collection[E]
illegal inheritance; anonymous class $anon inherits different type instances of trait Iterable: java.lang.Iterable[E] and java.lang.Iterable[E]

Зачем? Это имеет отношение к необработанным типам? ObservableList инвентарь IObservableList, который расширяет сырой тип java.util.List, Это ожидаемое поведение, и как я могу обойти это?

2 ответа

Решение

Наличие исходного типа Java в иерархии наследования вызывает такие проблемы. Одно из решений состоит в том, чтобы написать небольшой кусочек Java для исправления необработанного типа, как в ответе для метода сравнения переопределения класса Scala из интерфейса Java, который расширяет java.util.comparator

Подробнее о том, почему необработанные типы являются проблематичными для scala, см. Эту ошибку http://lampsvn.epfl.ch/trac/scala/ticket/1737. У этой ошибки есть обходной путь, использующий экзистенциальные типы, которые, вероятно, не будут работать в данном конкретном случае, по крайней мере, без большого количества приведения, потому что параметр типа java.util.List находится в позициях варианта как со, так и против.

При взгляде на javadoc аргумент конструктора не параметризован.

Я бы попробовал это:

val list = new java.util.ArrayList[_]
val obsList = new ObservableList(list, null) {}
Другие вопросы по тегам