1

クラス subA はクラス A のサブクラスです。メソッドをオーバーライドしようとしましたが、なぜかオーバーライドできません。何故ですか?パラメータの引数が原因ですか?

エラーメッセージの読み取り:

名前の衝突: subA の add(E#1) と A の add(E#2) は同じ消去がありますが、E#1、E#2 が型変数である場合、どちらも他方をオーバーライドしません:
E#1 は宣言されたオブジェクトを拡張しますclass subA
E#2 extends クラス A で宣言されたオブジェクト

スーパークラス A:

public class A <E> {    

public void add(E toInsert) {...}

}

サブクラス subA:

public class subA <E> extends A {      

//overrides the method from A class
public void add (E toInsert)    <-- doesn't let me overrides    
{...}  

}
4

3 に答える 3

7

Java 言語仕様の定義により、スーパークラスからすべての一般的な情報を削除するraw Aクラスをサブクラス化しています (汎用パラメーターは提供されていません)。これは、サブクラスのジェネリック メソッドが (現在は) 非ジェネリックのスーパークラス メソッドと互換性がないことを意味します。

Aサブクラスのジェネリック パラメーターを渡すことにより、ジェネリック パラメーターを提供します。

public class subA <E extends Comparable<E>> extends A<E> {      

    @Override 
    public void add (E toInsert) {
        // ...
    }
}
于 2013-06-02T01:49:34.453 に答える
0

C++ プログラミングにおける関数のオーバーライド

基本クラスと派生クラスに、同じ名前と引数を持つメンバー関数がある場合。派生クラスのオブジェクトを作成し、そのメンバー関数にアクセスするコードを記述した場合、派生クラスのメンバー関数が呼び出されるだけです。つまり、派生クラスのメンバー関数は基本クラスのメンバー関数をオーバーライドします。C++ プログラミングにおけるこの機能は、関数のオーバーライドとして知られています。

C++ プログラミングでの関数のオーバーライドを示す例 派生クラスから基底クラスのオーバーライドされた関数へのアクセス

派生クラスから基底クラスのオーバーライドされた関数にアクセスするには、スコープ解決演算子 ::. 例: 上記の例で、派生クラスから基底クラスの get_data() 関数にアクセスする場合は、派生クラスで次のステートメントを使用します。

A::get_data; // クラス A の get_data() を呼び出します。

クラスの名前が指定されていない場合、コンパイラは get_data() 関数が自分自身を呼び出していると見なすためです。

オーバーライドされた関数のスコープ解決演算子のユーザー - 詳細については、http: //www.programiz.com/cpp-programming/function-overriding#sthash.7UmWybpS.dpufを参照してください。

于 2013-06-18T11:07:26.387 に答える
-4
public class subA <E extends A> extends A { 

E は A で定義されているため、ジェネリックを A と同じジェネリック型に拡張する必要があります。誰かが私のものよりも良い説明を持っていると確信していますが、この方法が機能することは知っています。

于 2013-06-02T01:46:54.343 に答える