如何在Java中返回多个类的arraylist?

时间:2015-09-15 04:53:04

标签: java arraylist

我将创建一个返回多个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;
}

我的想法是检查Object param的类型,如果它的Human类然后返回Human的ArrayList。但由于类型不兼容,我无法像那样回归 问题是退货对象不具体 我如何解决它?谢谢!

5 个答案:

答案 0 :(得分:1)

我不确定你为什么会这样,工厂模式听起来更好主意,但也许就像...

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
    }

}

答案 1 :(得分:1)

我不确定这是否是您正在寻找的,但如果我理解您正在尝试做的事情,那么这应该有效。

您可以使用泛型来简化您正在做的事情

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

这将返回您传递给函数的任何类型的ArrayList。

答案 2 :(得分:0)

问题在于:如果您的方法定义表明您要返回ArrayList<Object>,则调用者希望收到ArrayList<Object>ArrayList<Human>在可以置于其中的内容中受到更多限制,因此无法履行类定义中设置的合同。

此外,如果你不知道你传递给创建ArrayList的方法的对象在编译时是什么类,那么你也不会知道你接收的是什么类型的ArrayList,所以即使你的方法确实有效,对你没有任何好处。

我不确定您要做什么,但第一步可能是确保您不仅仅是尝试使用更复杂的方式来使用ArrayList<Human> myList = new ArrayList<Human>();

答案 3 :(得分:0)

您可以在这里使用通用方法!您应该将代码更改为:

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

答案 4 :(得分:0)

您的代码无法编译,因为ArrayList<Human> 不是 ArrayList<Object>的子类型。对于数组,这是不同的。 Human[]Object[]的子类型。这样做的原因是通过使用类型系统来防止运行时错误。如果你的代码编译一个调用者可能会执行以下操作:

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

毕竟,aList应该包含任意Object s,因此编译。如果你用数组做。添加String后,您会收到ArrayStoreException

可以做些什么呢?这取决于您的要求。但是@Sweeeper和@FrozenHawk提供的代码可能适合你:

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

如果您不打算这样做,请在评论中提问。有更多的模式。