4

Javaのコードに問題があります。私には4つの(重要な)クラスがあります:

public class RDOutput extends OutputType
public class RDAnalysis extends AnalysisProperties 

今、私は分析プロパティでメソッドを作成しようとしています:

public abstract void display(ArrayList<? extends OutputType> results);

主な問題リストであるArrayListのオブジェクトは、OutputTypeのさまざまなサブタイプになります。私のクラスのRDAnalysisでは、特定のオーバーライドを作成しようとしています。

public void display(ArrayList<RDOutput> results) {

しかし、eclipseは次のように述べています。名前の衝突:RDAnalysis型のメソッドdisplay(ArrayList)は、AnalysisProperties型のdisplay(ArrayList?extends OutputType)と同じ消去を行いますが、オーバーライドしません。

私はJavaのトリックに精通していません。ドキュメントを検索してみましたが、この問題の解決策は見つかりませんでした。私の質問は次のとおりです:私が行っているトリック(抽象の基本型と最終関数の拡張)はJavaで可能ですか(はいの場合、どうすればそれを行うことができますか?)、またはこれを解決するために列挙型を作成する必要がありますか?

4

5 に答える 5

3

クラスにジェネリックパラメーターを導入し、それを使用してメソッドをパラメーター化することをお勧めします。

public abstract class A<T extends OutputType> {
    public abstract void display(ArrayList<T> results);     
}

public class B extends A<RDOutput> {
    public void display(ArrayList<RDOutput> results) {}     
}
于 2012-11-20T20:38:51.517 に答える
2

これは、ディスプレイが抽象メソッドのすべてのケースをカバーしているわけではないためです。多分このようなことを試してみてください:

public class RDOutput extends OutputType {}

public class OutputType {}

public abstract class AnalysisProperties<T extends OutputType> {
    public abstract void display(ArrayList<T> results);
}

public class RDAnalysis extends AnalysisProperties<RDOutput> {
    @Override
    public void display(final ArrayList<RDOutput> results) {
    }
}
于 2012-11-20T20:40:51.740 に答える
0

メソッドが期待している場合ArrayList<? extends OutputType>

ArrayList<RDOutput>親タイプはarraylist内のOutputTypeの子クラスを許可するため、これに渡すことはできません。

このようなコードを考えてみましょう

AnalysisProperties properties = new RDAnalysis();
properties.display(arraylist consisting of any child class of OutputType); //this line will        cause runtime problems
于 2012-11-20T20:39:07.143 に答える
0

問題は、可能なパラメーターを制限しながらメソッドをオーバーライドしようとすることです。

=> extends以降ArrayList<? extends OutputType>よりも多くの可能な要素を受け入れます。ArrayList<RDOutput>RDOutputOutputType

あなたは次のようなルールを破ります:関係するサブクラスメソッドは少なくともスーパークラス1の要素を包含しなければならず、決してそれらを制限しないでください。

したがって、コンパイラはこのオーバーライドを有効にしないようにします。

ちなみに、のような具体的な値で参照を入力することは避けてくださいArrayListLinkedList引数として渡されるのはどうですか?...のようなより一般的な関連タイプを好みますList

于 2012-11-20T20:43:22.337 に答える
0

ここでの問題は、型消去が機能した後、2つのメソッドのシグネチャが区別できないことです。これらは同じリターンタイプを持ち、両方とも受け入れることができますArrayList<RDOutput>が、最初のメソッド(一般的なもの)も任意のを受け入れることができますArrayList<T extends OutputType>

つまり、JVMは、を渡すと実行時に呼び出すものを選択できませんがArrayList<RDOutput>、同時に、displayメソッドはのリストに対してのみ機能するため、メソッドは抽象メソッドをオーバーライドしませんRDOutput。あなたの特定の実装List<T extends OutputType>を持つaT != RDOutputはそれを受け入れません。

他の回答で提案されているように、クラス全体で型パラメーターを使用することを検討するか、キャストなしではRDOutputメソッド内の特定のメソッドを使用できないという事実を受け入れる必要があります。display

于 2012-11-20T20:44:25.617 に答える