簡體   English   中英

如何為來自不同類的對象創建數組

[英]How to create an array for objects from different classes

假設我有以下內容:

public interface Talk {
    void Talks();
}

public interface Walk {
    void Walks();
}

public class Dog implements Talk, Walk {

    public Dog() {
        // ...
    }

    public void Talks() {
        // ...
    }

    public void Walks() {
        // ...
    }
}


public class Cat implements Talk, Walk {

    public Cat() {
        // ...
    }

    public void Talks() {
        // ...
    }

    public void Walks() {
        // ...
    }
}

I'm trying to add an object from class Dog, Dog dog = new Dog(...), and another object from class Cat, Cat cat = new Cat(...), to the same array, but since they are來自不同的 class,它們不能添加到同一個數組中。

So my solution was to create an abstract class, extend Talk and Walk to that abstract class, and have class Dog and Cat inherit from the abstract class, so I can create an array of the abstract class to put dog and cat objects.

Abstract abstract = { new Dog(...), new Cat(...) };

還有比這更好的解決方案嗎?

接口已經是一個好的開始。 您可以定義WalkTalk的數組,但對於組合,您需要另一個接口來組合兩者(以及您的類需要實現的接口)。

您可能還想使用 collections 代替 arrays,例如List<Walk>等。

請注意,我已經更新了我的答案,因為List<? extends Walk & Talk> List<? extends Walk & Talk>實際上是不可能的。 您可以使用<T extends Walk & Talk>List<T> ,但這只有在您對T使用具體類型時才有效,例如List<Dog> 如果您需要確保元素的實際類型實現了這兩個接口,這將非常有用,例如,如果Turtle只實現Walk <T extends Walk & Talk將不允許使用Turtle

那么為什么不是List<? extends Walk & Talk> List<? extends Walk & Talk>可能嗎? 一方面,您無法添加任何內容,因為編譯器不知道它是否安全(通配符?可以匹配List<Dog>List<Cat>但編譯器不知道)。

另一個原因是: list.get(index)的返回類型是什么? 會是Walk嗎? 會是Talk嗎? 編譯器無法決定並需要您。 如果你創建一個接口WalkTalk extends Walk, Talk你可以使用它並且編譯器很高興:)

Object 是所有 Java 對象的根。 如果您聲明 Object[] 或 List 您可以將任何 JAVA object 初始化/添加到數組或列表中。 並在提取元素時進行強制轉換。 例子:

Object[] objs = { (Object)(new Dog()), (object)(new Cat(), ... }
// or
List<Object> lobj = new ArrayList<>();
lobj.add((Object) new Dog());
...
Dog dog = (Dog) lobj.get(0);
// or
Cat cat = (Cat)objs[1];

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM