3

これを行う方法を理解したと思いましたが、予期しない動作が発生しているため、何かが欠けているようです。これが問題の煮詰めです。

基本クラス:

public abstract class Base<T>
{
    abstract public void foo(List<? extends T> l);
}

派生クラス:

public class Derived<T> extends Base
{
    @Override
    public void foo(List<? extends T> l) { return; }
}

基本クラスは問題なく準拠していますが、派生クラスをコンパイルすると次のようになります。

Derived.java:3: Derived は抽象的ではなく、Base の抽象メソッド foo(java.util.List) をオーバーライドしません

public class Derived extends Base
^
Derived.java:5: メソッドはスーパータイプのメソッドをオーバーライドまたは実装しません

@Override  
^  

2 エラー

パラメータのジェネリックがList<? extends T>問題の原因のようです。両方の署名のその部分を基本型に置き換えると、int問題なく完了します。

ここで何が起こっているのか誰か教えてもらえますか?

4

2 に答える 2

8

やったほうがいい

public class Derived<T> extends Base<T>

<T>指定する必要がありますそれ以外の場合は、ジェネリックなしで ieBaseを宣言するだけでメソッドをオーバーライドする必要がありますList

于 2012-10-25T21:09:55.080 に答える
1

次のように、クラス宣言で型パラメーターを渡すこともできます。

    public class Derived extends Base<SomeConcreteType> {

        @Override
        public void foo(List<SomeConcreteType> l) {
            // ...
        }
    }

派生クラスで具象型を使用するため、抽象クラスのジェネリック部分が不要になった場合。それ以外の場合は、他の回答が述べたことを行う必要があります。

于 2012-10-25T21:24:45.937 に答える