Преобразование переопределения метода с подстановочным знаком из Java в Scala
У меня есть подпись метода Java, которую я не могу преобразовать в подпись в Java.
Вот код Java:
public class InjectorListCellRenderer extends DefaultListCellRenderer {
public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
throw new RuntimeException("not important");
}
}
А вот код Scala, который, я надеялся, будет эквивалентен:
class InjectorListCellRenderer(var painter: ParticleLabelPainter) extends DefaultListCellRenderer {
override def getListCellRendererComponent(list: JList[_], value: Any, index: Int, isSelected: Boolean, cellHasFocus: Boolean): Component = {
throw new RuntimeException("not important")
}
}
Однако при компиляции с sbt и Scala 2.11.8 я получаю следующую ошибку:
Класс InjectorListCellRenderer должен быть абстрактным, поскольку метод getListCellRendererComponent в свойстве ListCellRenderer типа (x$1: javax.swing.JList[_ <: Object], x $ 2: Object, x $ 3: Int, x $ 4: Boolean, x $ 5: Boolean) java.awt.Component не определен
Документацию по базовому классу DefaultListCellRenderer можно найти здесь.
Я не могу воспроизвести эту проблему с моим собственным кодом.
2 ответа
Исходя из сообщения об ошибке, я думаю, должно работать следующее:
class InjectorListCellRenderer(var painter: ParticleLabelPainter) extends DefaultListCellRenderer {
override def getListCellRendererComponent(list: JList[_ <: AnyRef], value: AnyRef, index: Int, isSelected: Boolean, cellHasFocus: Boolean): Component = {
throw new RuntimeException("not important")
}
}
Изменить: после некоторых экспериментов я думаю, что наследование от DefaultListCellRenderer
и переопределение getListCellRendererComponent
невозможно из-за некоторого несоответствия между типами представлений Java и Scala. Если это важно для вас, вы можете рассмотреть возможность сообщения об ошибке.
Он говорит, что тип аргумента JList не тот же, потому что вы оставили его как дыру [_]
но он ожидает хотя бы объекта.
Кажется, работает, если вы положите object
, any
или сделать это параметрическим с T
,
class InjectorListCellRenderer() extends DefaultListCellRenderer{
def getListCellRendererComponent(list: JList[Object], value: Any, index: Int, isSelected: Boolean, cellHasFocus: Boolean) = ???
}
или же
class InjectorListCellRenderer() extends DefaultListCellRenderer{
def getListCellRendererComponent[T](list: JList[T], value: Any, index: Int, isSelected: Boolean, cellHasFocus: Boolean) = ???
}