0

我有一个 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 需要是抽象的,因为类型为 (x$1: javax.swing.JList[_ <: Object], x$2: Object, x$3: Int, x$4: Boolean, x$5: Boolean 的 trait ListCellRenderer 中的方法 getListCellRendererComponent )java.awt.Component 未定义

可以在此处找到基类 DefaultListCellRenderer 的文档。

我似乎无法用我自己的代码重现这个问题。

4

2 回答 2

3

从错误消息开始,我猜以下应该有效:

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")
  }
}

编辑:经过一些实验,我认为由于 Java 和 Scala 的类型表示之间存在一些不一致,因此无法继承DefaultListCellRenderer和覆盖。getListCellRendererComponent如果这对您很重要,您可以考虑提交错误报告。

于 2017-05-20T07:51:59.927 回答
-1

它说 JList 参数的类型不一样,因为你把它当作一个洞[_],但它至少需要对象。

如果你把它设置为参数,object似乎可以工作。anyT

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) = ???
}
于 2017-05-20T07:47:00.507 回答