2

extendsscala 2.10.2 では、クラスからのコードがあり、次の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プログラミングは一切行っていません。しかし、この例の問題点がわかりません。同様の質問を見つけましたが、このアンダースコア (" _") のものではありません。

fこの例では、 class からの抽象メソッドの実装を提供しようとしていますC[A]

この問題に関するコメントまたは回答をありがとうございます。

4

2 に答える 2

1

元のケースでの制約が何であるかはわかりませんが、あなたの例では、f をオーバーライドするときに B[String] の代わりに B[_] を使用できますか?

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

この場合のアンダースコアは存在型であり、Any の任意のサブタイプにすることができます。Scala における存在型の詳細については、こちらを参照してください。

于 2013-09-02T13:03:51.977 に答える