Преобразование переопределения метода с подстановочным знаком из 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) = ???
}
Другие вопросы по тегам