簡體   English   中英

如何在Java中返回多個類的arraylist?

[英]how to return arraylist of multiple class in Java?

我將要創建一個返回多個Object的ArrayList的方法,如下所示:

public ArrayList<Object> getData(Object similar) {

    //I suppose that I have 2 ArrayList that already contain data here
    ArrayList<Human> humans = new ArrayList<Human>();
    ArrayList<Animal> animals = new ArrayList<Animal>();

    if (similar.getClass().equals(Human.class)) {
        return humans;
    }

    if (similar.getClass().equals(Animal.class)) {
        return animals;
    }

    return null;
}

我的想法是檢查對象參數的類型,如果它是Human類,則返回Human的ArrayList。 但是由於類型不兼容,我無法像這樣返回。
問題是返回對象不是特定的。
我如何解決它? 謝謝!

我不確定為什么會這樣,工廠模式聽起來像是一個更好的主意,但也許...

public <T> ArrayList<T> getData(T similar) {
    if (similar.getClass().equals(Human.class)) {
        return (ArrayList<T>) new ArrayList<Human>();
    }

    if (similar.getClass().equals(Animal.class)) {
        return (ArrayList<T>) new ArrayList<Animal>();
    }

    return null;
}

然后您應該可以使用類似

ArrayList<Human> humans = getData(new Human());
ArrayList<Animal> animals = getData(new Animal());

稱呼它

根據您想要的嚴格程度,您還可以使用類似...

if (Human.class.isInstance(similar)) {

這將允許您捕獲Human子類

但是,對我而言,這沒有任何意義。 您的方法應明確定義它願意做什么。 也許,而不是嘗試使用單個方法為多個類返回數據,也許您應該考慮使用工廠模式,例如...

public abstract class AbstractFactory<T> {
    public abstract List<T> getData();
}

public class HumanFactory extends AbstractFactory<Human>{

    @Override
    public List<Human> getData() {
        return new ArrayList<>(); // Or what ever data you need it filled with
    }

}

public class AnimalFactory extends AbstractFactory<Animal>{

    @Override
    public List<Animal> getData() {
        return new ArrayList<>(); // Or what ever data you need it filled with
    }

}

我不確定這是否是您要尋找的東西,但是如果我了解您要正確做的事,那應該可以。

您可以使用泛型來簡化您的工作

public ArrayList<T> getData(T similar) {
    return new ArrayList<T>();
}

這將返回您傳遞給函數的任何類型的ArrayList。

問題出在這里:如果您的方法定義表明您要返回ArrayList<Object> ,則調用方希望收到一個ArrayList<Object> ArrayList<Human>在可放置內容方面受到更多限制,因此無法滿足類定義中提出的約定。

此外,如果您不知道要在編譯時傳遞給用於創建ArrayList的方法的對象是什么類,那么您也不知道接收到的是哪種類型的ArrayList,因此即使您的方法做到了工作對您沒有任何好處。

我不確定您要做什么,但第一步可能是確保您不只是嘗試設計一種更復雜的方法來使用ArrayList<Human> myList = new ArrayList<Human>();

這是您使用通用方法的地方! 您應該將代碼更改為此:

public <T> ArrayList<T> getData (T similar) {
    return new ArrayList<T> ();
}

但這確實沒有道理。 因為為什么要創建一個ArrayList方法? 您可以像這樣創建任意一種類型:

ArrayList<WhateverTypeYouLike> = new ArrayList<> ();

但是,如果您確實要執行此操作,則以下是有關泛型方法的更多信息:

https://docs.oracle.com/javase/tutorial/extra/generics/methods.html

您的代碼無法編譯,因為ArrayList<Human> 不是 ArrayList<Object>的子類型。 對於數組,那是不同的。 Human[]Object[]的子類型。 這樣做的原因是通過使用類型系統來防止運行時錯誤。 如果您的代碼可以編譯,則調用者可以執行以下操作:

ArrayList<Object> aList = getData(new Human());
list.add("some String");

畢竟, aList應該包含任意Object ,因此可以編譯。 如果用數組來做。 添加String時,您將獲得ArrayStoreException

關於這個還能做什么? 這取決於您的要求。 但是可能@Sweeeper和@FrozenHawk呈現的代碼應該對您有用:

public <T> ArrayList<T> getData (T similar) {
  return new ArrayList<T> ();
}

如果這不是您的意圖,請在評論中提出。 有更多的模式。

暫無
暫無

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

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