簡體   English   中英

將List <Animal>轉換為List <Dog>

[英]Casting List<Animal> to List<Dog>

我有一個Animal.Class和Dog類,它擴展了Animal.Class

我可以知道是否有一種快速簡便的方法嗎?

List<Dog> dogList = getAnimalList();

public List<Animal> getAnimalList(){
     List<Animal> animalList = new LinkedList<Animal>();
     return animalList;
}

除非絕對必要,否則我不希望再看整個動物名單。

dog類只包含一個額外的布爾值以用於其他檢查目的。

泛型繼承與java繼承原則略有不同。 你需要用? (通配符)

List<? extends Animal> dogList = getAnimalList();

編輯:

通配符指南:

  1. 使用extends關鍵字定義帶有上限通配符的“in”變量。
  2. 使用super關鍵字,使用下限通配符定義“out”變量。
  3. 在可以使用Object類中定義的方法訪問“in”變量的情況下,使用無界通配符。
  4. 在代碼需要作為“in”和“out”變量訪問變量的情況下,不要使用通配符。

你的問題並不完全清楚,所以我就解決什么可能是您的問題。

如果你有動物名單,其中包含多種動物:

List<Animal> animals = new ArrayList<>();
animals.add(new Dog());
animals.add(new Cat());
animals.add(new Hippo());

並且您希望將該列表的元素過濾到特定的子類型,然后您需要迭代該列表並檢查/強制轉換為子類型:

List<Dog> dogs = new ArrayList<>();

for (Animal animal : animals) {
    if (animal instanceof Dog) {
        dogs.add((Dog)animal);
    }
}

使用Guava更容易完成:

List<Dog> dogs = Lists.newArrayList(Iterables.filter(animals, Dog.class));

暫無
暫無

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

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