[英]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.