9

戻り型をキャストすることを強制されることなく、異なる戻り型を持つメソッドを実装してオーバーライドしようとしています。

public abstract class A {
public abstract Object getValue(String content);
}

public class B extends A {
public String getValue(String content) {...}
}

public class C extends A {
public int getValue(String content) {...}
}


public class D extends A {
public boolean getValue(String content) {...}
}

// Main loop:
for (A a : allAs)
{
// I want to use the method getValue() and corresponding to the type return a String, int or boolean without casting the return type
}

私の質問:キャストを強制されることなく、異なるタイプを返すことは可能ですか?問題を解決するための抽象メソッドはどのように見えますか?

コンパイラは戻り型を知っている必要があるので、解決策が必要だと思います...

4

4 に答える 4

19

あなたの例では、クラスCDはコンパイルされません。それらのオーバーライドされたメソッドは、Liskov 置換原則に違反しています。別名、戻り値の型は親クラスと互換性がありません。戻り値の型としてプリミティブを使用しない限り、ジェネリックを使用して目的を達成できます。

abstract class A<T> {
    public abstract T getValue(String content);
}

class B extends A<String> {
    public String getValue(String content) { }
}

class C extends A<Integer> {
    public Integer getValue(String content) { }
}

class D extends A<Boolean> {
    public Boolean getValue(String content) { }
}
于 2013-02-23T06:46:48.610 に答える
3

あなたが説明することは一般的に不可能です。ただし、サブクラスがスーパークラスメソッドreturnの「より狭い」サブタイプを返す場合、これは「共変リターンタイプ」と呼ばれ、JDK1.5以降のJavaで許可されています。しかし、あなたの例に基づいて、私は共変リターンがあなたが探しているものではないと思います。

私はあなたが欲しいものは

for (A a : allAs)
{
    String b = a.getValue();
    int    c = a.getValue();
}

ここでの問題は、もちろん、コンパイラーがコンパイル時にこれら2つのステートメントのどちらが正しいかを知る方法がなく、両方が正しいことはできないということです。

于 2013-02-23T06:43:07.403 に答える
2

ジェネリックを使用できます。

public abstract class A<T> {
   public abstract T getValue(String content);
}

public class B extends A<String> {
   public String getValue(String content) {...}
}

など... int はこれの戻り値の型として機能しませんが、Integer は機能します。

私はコンパイラで入力していないので、タイプミスがあるかもしれません...

Jim と Chris が指摘したように、As をループしている場合、"A" の結果しか取得できません。これは Object です。

于 2013-02-23T06:54:30.493 に答える
1

あなたの例では、 のサブクラスであるため、 の定義はclass B問題ありません。他の 2 つはプリミティブ型であるため、コンパイルできません。ただし、それを解決するためにそれらをandに置き換えることができます。StringObjectIntegerBoolean

メインループに関しては、 への参照としてそれらを反復処理している場合、 を返すメソッドの の定義Aのみを使用できます。AObject

于 2013-02-23T06:46:58.977 に答える