类铸造不清楚

时间:2012-06-26 09:28:37

标签: java oop class casting

我有以下抽象类:

public abstract class AbstractGroup {

private String name;
.
.
.
}

我有两个扩展这个抽象类的空类:

public class GroupA extends AbstractGroup {
}

public class GroupB extends AbstractGroup {
}

有没有办法在不获取ClassCastException的情况下投射以下内容: (group的类型为GroupA

group = (GroupB)group;

我需要这个对象实例成为GroupB

6 个答案:

答案 0 :(得分:11)

这是不可能的。您不能水平投射类,而只能垂直投射。 GroupA不是GroupB的子类型,因此始终会引发异常。

答案 1 :(得分:1)

不,你不能。您可以在继承层次结构中强制转换。

答案 2 :(得分:1)

不,你不能,因为一个组不是A组的实例。 怎么样:

public abstract class AbstractGroup {

  public Enum Group { GroupA, GroupB; }

  private String name;
  private Group membership;
.
.
.
}

然后:

group.setMembership(GroupB);

答案 3 :(得分:1)

您要求的不是 cast ,而是转换。这两个术语都包含在术语强制中。 Java不会自动为您转换对象,即使它尝试也不会,因为这通常是一个定义不明确的问题。您必须编写自己的代码来进行转换 - 可以是转换构造函数的形式,也可以是某种静态转换方法,也可以是源对象中返回转换对象的实例方法。

答案 4 :(得分:0)

不,不可能。但您可能想要做的是向组添加一些构造函数以允许从不同的实现构造。

public class GroupA extends AbstractGroup {
    public GroupA(AbstractGroup otherGroup) {
        this.name = otherGroup.name;
    }
}

但是,如果您发现自己需要这样做,那么您的设计可能就错了。

答案 5 :(得分:-1)

如果您执行以下操作,则可能:

    GroupA groupAobj = new GroupA();
    AbstractGroup abstractObj = (AbstractGroup) groupAobj;
    GroupB groupBobj = (GroupB) abstractObj;

代码编译并运行。