2

使用 scala 2.10.2,我有一个extends来自类的代码,scala.swing.ListView[SomeClass]我得到这个错误:

src/some.scala:100: error: class Some_Renderer needs to be abstract, since method componentFor in class Renderer of type (list: scala.swing.ListView[_ <: SomeClass], isSelected: Boolean, focused: Boolean, a: SomeClass, index: Int)scala.swing.Component is not defined
  private class Some_Renderer extends ListView.Renderer[SomeClass]

编辑:“一个额外的注意”实际上是这里的错误,因为评论B[String]必须是B[_].

编辑:一些真实的例子如下

我已将其复制为以下示例,但有一个额外的注释:

scala> class B[A] { val m : Int = 0 }
defined class B

scala> abstract class C[A] { def f(l: B[_]):Int }
defined class C

scala> private class D extends C[String] { def f(l: B[String]):Int = { l.m } }
<console>:9: error: class D needs to be abstract, since method f in class C of type (l: B[_])Int is not defined
(Note that B[_] does not match B[String]: their type parameters differ)
   private class D extends C[String] { def f(l: B[String]):Int = { l.m } }

编辑:MWE

import scala.swing.{Component, Label, ListView}
class Test
object Retn extends Label { opaque = false }
private class TestRenderer extends ListView.Renderer[Test]
{
    def componentFor(list: ListView[_], isSelected: Boolean, focused: Boolean, test: Test, index: Int): Component =
    {
        val retn = Retn
        retn
    }
}
<console>:9: error: class TestRenderer needs to be abstract, since method componentFor in class Renderer of type (list: scala.swing.ListView[_ <: Test], isSelected: Boolean, focused: Boolean, a: Test, index: Int)scala.swing.Component is not defined
           private class TestRenderer extends ListView.Renderer[Test]
                         ^

编辑:MWE

我只是想修补那行代码,绝不scala做编程。但是我不明白这个例子有什么问题。我发现了类似的问题,但没有用这个下划线(“ ”)的东西。_

该示例尝试为fclass中的抽象方法提供实现C[A]

感谢您对此问题的评论或回答。

4

2 回答 2

2

B[_]是“存在类型”,但您可以将其理解为大致等价于B[Any].

错误信息告诉你Note that B[_] does not match B[String]: their type parameters differ。您不会期望能够在覆盖的定义List[Any]中用 a 替换参数,对List[String]吗?因为当你传递 a 时会发生什么,这也是抽象类所要求List[Int]的善意?List[Any]

解决方案:替换def f(l: B[String]):Int = ...def f(l: B[_]):Int = ...

编辑:你的 MWE 的问题是你已经在一行上定义了类,然后你在下TestRenderer一行编写了一个由{ }将 the{放在上一行的末尾),但由于您在 REPL 中,因此一旦您点击返回,类定义就会被解释。解决方案:要么将 放在行{尾,private class ...要么输入:paste以允许您在解释之前写下该批次。

...至少,我认为这就是您的问题。MWE 在 scala 2.10.0 REPL 中对我来说工作得很好,尽管如果我只是输入该private class ...行,我会得到一个稍微不同的错误消息。

于 2013-09-02T12:56:53.950 回答
1

我不确定你原来的情况有什么约束,但在你的例子中,你可以在覆盖 f 时使用 B[_] 而不是 B[String] 吗?

class D extends C[String] { def f(l: B[_]):Int = { l.m } }

在这种情况下,下划线是存在类型,可以是 Any 的任何子类型。有关 Scala 中存在类型的更多信息,请参见此处

于 2013-09-02T13:03:51.977 回答