java—一个对象可以容纳自己的对象数组但是,这与继承如何协同工作呢?

ngynwnxp  于 2021-06-29  发布在  Java
关注(0)|答案(4)|浏览(306)

我有以下抽象类:

public abstract class Entity{
  private final ArrayList<Entity> parent;

  // a lot of code that is not important now
}

这个类的一个示例拥有一个“它自己的对象”的arraylist。但是,我如何为“实体”的所有子类归档相同的东西呢?e、 g.我有一门课:

public class Player extends Entity {
   // a lot of code that is not important now
}

现在“玩家”持有 ArrayList<Entity> 但它应该有一个 ArrayList<Player> . 对于实体的所有子类,这应该是相同的(有很多)。我的伪代码是: ArrayList<THIS> parent .
我怎样才能做到这一点?

mjqavswn

mjqavswn1#

可以将对象用作类型。java中的所有类都是object类的子类。代码:

public abstract class Entity{
 private final ArrayList<Object> parent;

 // a lot of code that is not important now
}

然后,在引用arraylist时,只需将其强制转换为当前类。例子:

(Player) parent.getItem(int itemNumber);
cigdeys3

cigdeys32#

为了达到这个目的,你可以让你的班级 Entity 泛型类。例子:

public abstract class Entity<THIS extends Entity<?>> {

    private final List<THIS> parents = new ArrayList<>();

    public final List<THIS> getParents() {
        return parents;
    }

}

您的子类现在可以如下所示:

public final class Player extends Entity<Player> { ... }

使用它看起来像这样:

public static void main(String[] args) {
    Player player = new Player();
    List<Player> playerParents = player.getParents();
    System.out.println(playerParents);
}
bgtovc5b

bgtovc5b3#

你可以用这个来实现。
我们声明一个泛型t,然后添加一个规则,该泛型必须扩展实体类。
类player,从实体扩展,然后,可以使用。
以下代码。。。

public abstract class Entity<T extends Entity> {
  private final ArrayList<T> parent;    
}

public class Player extends Entity<Player> {
}
ggazkfy8

ggazkfy84#

实际上,你不能这么做。java没有这个特性(自类型)。理论上,您可以这样做,但它有一些限制,以便它是类型安全的。
假设您可以这样做,那么我可以这样编写代码:

Entity e = new Player();
e.parent.add(new SomeOtherKindOfEntity());

那没什么意义,是吗? e 会有一个 ArrayList<Player> ,但编译器认为我们可以添加 SomeOtherKindOfEntity 去吧!所以你不能用这种类型 Entity 作为变量的类型。
下面是另一个类似的情况:

Player p = new SubclassOfPlayer();
p.parent.add(new Player());

实际上,您可以使用泛型参数来解决此问题:

public abstract class Entity<T extends Entity<T>> {
  private final ArrayList<T> parent;

  // a lot of code that is not important now
}

public class Player extends Entity<Player> { }

大多数java程序员都会认识到泛型参数与子类本身是同一类型的,但是编译器没有。这就是为什么这只是一个解决办法,而不是真正的“自我类型”。

相关问题