如何在Java中返回多个类的arraylist?
我将创建一个返回多个对象的ArrayList的方法,如下所示:如何在Java中返回多个类的arraylist?,java,arraylist,Java,Arraylist,我将创建一个返回多个对象的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
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;
}
public ArrayList getData(对象类似){
//我假设我有2个ArrayList,其中已经包含了这里的数据
ArrayList humans=新的ArrayList();
ArrayList动物=新的ArrayList();
if(类似的.getClass().equals(Human.class)){
回归人类;
}
if(类似的.getClass().equals(Animal.class)){
归还动物;
}
返回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;
}
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
}
}
公共抽象类AbstractFactory{
公共摘要列表getData();
}
公共类HumanFactory扩展了AbstractFactory{
@凌驾
公共列表getData(){
返回新的ArrayList();//或需要填充的任何数据
}
}
公共类AnimalFactory扩展了AbstractFactory{
@凌驾
公共列表getData(){
返回新的ArrayList();//或需要填充的任何数据
}
}
我不确定这是否是您正在寻找的,但如果我了解您正试图正确执行的操作,这应该会起作用
通过使用泛型,您可以简化您正在做的事情
public ArrayList<T> getData(T similar) {
return new ArrayList<T>();
}
public ArrayList getData(T类似){
返回新的ArrayList();
}
这将返回传入函数的任何类型的ArrayList。问题在于:如果方法定义说返回的是
ArrayList
,则调用方希望收到ArrayList
。ArrayList
在可放置的内容上受到更多限制,因此无法履行类定义中提出的契约
此外,如果您不知道在编译时要传递到方法中以创建ArrayList的对象是什么类,那么您也不知道要接收什么样的ArrayList,因此即使您的方法确实有效,也不会对您有任何好处
我不确定您想做什么,但第一步可能是确保您不只是试图设计一种更复杂的方法来使用ArrayList myList=new ArrayList()代码>这里是使用通用方法的地方!您应该将代码更改为:
public <T> ArrayList<T> getData (T similar) {
return new ArrayList<T> ();
}
但如果你真的想这样做,这里有一些关于泛型方法的更多信息:
您的代码不会编译,因为ArrayList
不是ArrayList
的子类型。对于数组,这是不同的Human[]
是Object[]
的子类型。原因是通过使用类型系统来防止运行时错误。如果您的代码要编译,调用方可能会执行以下操作:
ArrayList<Object> aList = getData(new Human());
list.add("some String");
如果这不是你的意图,请在评论中询问。这方面有更多的模式。这比仅仅从调用新的ArrayList()开始有什么改进?在不知道类的情况下,他也不能调用该方法;是愚蠢的;如果他知道他想要和ArrayList,他就可以使用ArrayList humans=new ArrayList()@DarkSquirtings Duh,我只是从OP开始,正如我所说的,如果我真的那么关心,我只会使用工厂模式。我知道如何创建这样的ArrayList,但这不是我想要的。我的方法得到param的类型,依赖它,我知道应该返回什么。我编辑了我的问题,我希望它更清楚!但你为什么想要这个?如果可以将对象传递给方法,则必须知道其类型。这意味着您可以使用对象的类型创建一个数组列表。不需要编写方法。这是家庭作业还是什么@NgoKimHuynhI知道我可以创建两个返回ArrayList和ArrayList的方法。但如果我的想法是可能的,我不需要写两次。似乎你误解了我。但不管怎样。
ArrayList<WhateverTypeYouLike> = new ArrayList<> ();
ArrayList<Object> aList = getData(new Human());
list.add("some String");
public <T> ArrayList<T> getData (T similar) {
return new ArrayList<T> ();
}