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
if(obj instanceof Foo)
{
    Foo foo = (Foo)obj;
}

if(obj instanceof Bar)
{
    Bar bar = (Bar)obj;
}
于 2012-11-22T08:05:14.413 回答
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 回答