Почему 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) {}