Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Java中返回多个类的arraylist?_Java_Arraylist - Fatal编程技术网

如何在Java中返回多个类的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

我将创建一个返回多个对象的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;
}
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> ();
}