1

我有以下抽象类:

public abstract class AbstractGroup {

private String name;
.
.
.
}

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

public class GroupA extends AbstractGroup {
}

public class GroupB extends AbstractGroup {
}

有没有办法在没有得到的情况下进行以下转换ClassCastException:(group是类型GroupA

group = (GroupB)group;

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

4

6 回答 6

10

这是不可能的。您不能水平投射课程,而只能垂直投射。GroupA不是的子类型,GroupB所以总是会引发异常。

于 2012-06-26T09:30:51.320 回答
1

不,你不能。您可以向上或向下转换继承层次结构。

于 2012-06-26T09:32:09.627 回答
1

不,你不能,因为 GroupA 不是 GroupB 的实例。怎么样:

public abstract class AbstractGroup {

  public Enum Group { GroupA, GroupB; }

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

进而:

group.setMembership(GroupB);
于 2012-06-26T09:36:59.110 回答
1

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

于 2012-06-26T10:24:26.067 回答
0

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

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

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

于 2012-06-26T09:34:16.423 回答
-1

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

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

代码编译并运行。

于 2012-06-27T10:39:17.543 回答