从集合中获取子类实例 - Java

时间:2012-12-25 19:50:41

标签: java collections

这是一个Java编程情况,我希望看到任何可能的改进。

B类是A类的子类.B的一些实例在Collection中。根据类型,我可以使用instanceof从集合中检索B类实例。但是,我不能将这些实例视为B类的实例,但是A类只是因为不允许向下转换。因此,我必须通过在A类中使用覆盖getter来获取一些小实例。此解决方法存在一些问题。例如,某些getter在父类中没有意义,父类不能是抽象的。

有更好的解决方案吗?

2 个答案:

答案 0 :(得分:1)

没有强制转换的一种方法是使用visitor pattern。它在Java中有点冗长,但非常具有可扩展性......

interface Visitor {
    void visit(A a)
    void visit(B b)
}

class BOnlyVisitor implements Visitor {
    public void visit(A a) {
        throw new UnsupportedOperationException();
    }

    public void visit(B b) {
        // Do stuff with b
    }
}

interface Visitable {
    void accept(Visitor v)
}

class A implements Visitable {
    public void accept(Visitor v) {
        v.visit(this);
    }
}

class B implements Visitable {
    @Override
    public void accept(Visitor v) {
        v.visit(this);
    }
}

答案 1 :(得分:0)

不要向对象询问信息以执行某些操作,而是要求对象直接执行此操作。例如,替换

int a = object.getA();
int b = object.getB();
int sum = a + b;

int sum = object.computeSum();

这样,如果子类没有getB()方法,因为它总是被认为是0,它可以使用

实现方法computeSum()
return this.a;

对不起这个愚蠢的例子,但这就是主意。向对象添加行为,而不是使用getter和setter创建数据结构。如果你发布一个你必须做的具体例子,我可以提供更多帮助。