我想问你一个方法如何在Java中返回不同类型的对象?
假设我们有一个类“ a”。类a是类“ b”和“ c”的父类。
假设我们有一个定义为的数组列表:
java.util.ArrayList<a> list;
因此此列表可以包含a类,b类和c类的对象。
假设我们创建一个b类的对象,一个c类的对象,然后将它们添加到列表中。
现在,我想创建一个像这样的方法:
public ? get_element(boolean first)
{
if (first)
{
return list.get(0);
}
else
{
return list.get(1);
}
}
我的问题是,我不知道在“?”处放什么。用这种方法。
如果我放“ a”,那么“ public a get_element”,则在返回元素时,它始终为“ a”类型,无论元素最初添加时是“ b”还是“ c”类型。
但是我希望返回的元素是添加的元素类型。
因此,如果我在列表的索引0处添加类型“ b”的元素,并在索引1处添加类型“ c”的元素,我希望在我调用get_element方法时,如果我提供的参数等于“ false”,则返回元素的类型为“ c”,如果我在调用它时提供true,则返回的元素的类型为b。
当然,我可以将返回的元素转换为我希望的类型。但这只是我写的简单示例,但实际上我的情况要复杂得多。我大约有10个类,它们都扩展了一个类,并且数组列表可以包含这11种对象中的任何一种,并且它们可以以任何方式排列,所以除非不知道,否则我不知道什么类型的元素位于哪个位置创建将尝试逐一转换为所有类型的代码,直到找到可以转换的类型为止。
但是我想知道,有没有更简单的方法呢?
为了简化我的问题,我编写了这个.java文件:
public class test
{
public static class a{}
public static class b extends a{}
public static class c extends a{}
public static java.util.ArrayList<a> list = new java.util.ArrayList<a>(2);
static
{
b first_object = new b();
c second_object = new c();
list.add(first_object);
list.add(second_object);
b first_returned_object = get_element(true);
c second_returned_object = get_element(false);
}
public static ? get_element(boolean first)
{
if (first)
{
return list.get(0);
}
else
{
return list.get(1);
}
}
}
我的问题是我不知道在get元素方法中的“ get_element”之前要放什么。
为了可以将类型b的对象保存在“ first_returned_object”中,将类型c的对象保存在“ second_returned_object”中,我应该怎么做?
当然,这只是示例,我不会使用这些类,因为它们是无用的,但是我写了这个使我的问题尽可能简单。
我遇到此类问题的真实班级有5000多行,因此我无法在此处包含这些行,因此我编写了最简单的版本来演示我的问题。
有什么建议么?
谢谢
脚本后:
大写锁定仇恨者:这里的仇恨是双向的。 ;)
最佳答案
您可以使用泛型来使返回类型动态化。
试试这个:
public static <Type> Type get_element(int index)
{
String s = list.get(index).getClass().toString(); // returns "class class_name"
String[] split = s.split(" ");
Class<?> theClass = Class.forName(split[1]); // You need "class_name"
return (Type) theClass.cast(list.get(index));
}
或者简单地:
public static <Type> Type get_element(int index)
{
return (Type) list.get(index);
}