0

基本クラスがあるとします:

abstract class TheBase {}

class Foo extends TheBase {}
class Bar extends TheBase {}

そして、ベースオブジェクトをこの型に「キャスト」したい:

TheBase obj = getFromSomewhere();

Foo foo = obj.asA(Foo.class);

Bar bar = obj.asA(Bar.class);

asA次のように定義した例外をスローします。CustomCannotCastException()

これは可能ですか?

4

3 に答える 3

9

このようなものが必要ですか?

public class TheBase {
    public <T> T asA(Class<T> claxx) {
        if (claxx.isInstance(this)) {
            return claxx.cast(this);
        } else {
            throw new CustomCannotCastException();
        }
    }
}
于 2012-11-22T08:09:24.457 に答える
1

asA-MethodをTheBase-Classに入れません。次のようなコードを作成します。

TheBase obj = getFromSomewhere();
Foo foo = Foo.getInstance(obj);
Bar bar = Bar.getInstance(obj);

//FOOの例

 public Foo getInstance(TheBase aBaseSomething) {
        if (aBaseSomething instanceof Foo) {
            return (Foo)aBaseSomething;
        } else {
            throw new CustomCannotCastException();
        }
    }

したがって、必要なサブクラスは何をすべきかを決定でき、スーパークラスはサブクラスがあることを知る必要はありません。

于 2012-11-22T08:20:38.327 に答える
1
if(obj instanceof Foo)
{
    Foo foo = (Foo)obj;
}

if(obj instanceof Bar)
{
    Bar bar = (Bar)obj;
}
于 2012-11-22T08:05:14.413 に答える