我将创建一个返回多个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。但由于类型不兼容,我无法像那样回归 问题是退货对象不具体 我如何解决它?谢谢!
答案 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> ();
}
如果您不打算这样做,请在评论中提问。有更多的模式。