【发布时间】:2016-11-19 05:24:31
【问题描述】:
想问一下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_element”之前放什么。
我应该怎么做才能将 b 类型的对象保存在“first_returned_object”中,并将 c 类型的对象保存在“second_returned_object”中?
当然,这只是一个例子,我不会使用这些类,因为它们没用,但我写这个是为了让我的问题尽可能简单。
我遇到此类问题的真实课程有 5000 多行,因此我无法在此处包含这些,因此我编写了最简单的版本来演示我的问题。
有什么建议吗?
谢谢。
发布脚本: 对大写锁定仇恨者:您的仇恨在这里是双向的。 ;)
【问题讨论】:
-
public a get_element(boolean first)程序到接口。 -
在没有显式转换的情况下,Java 不支持多态返回(和多态集合)。如果您的数组列表被声明为包含
A类型,它可以包含属于A子类型的元素,但您不能编写返回实际类型的方法,只有A类型的引用,您必须将其转换为@ 987654330@ 或C如果您需要使用仅出现在B或C上的方法或公共成员。 -
只是对任何未来问题的注释,这个网站是为专业人士准备的。请在适当的时候使用 shift 键。
-
如果你需要知道一个对象的具体类型,那么你的类结构就有缺陷。您可能想使用SOLID principles 重新设计它。
-
返回
a。这是唯一有意义的事情。您的客户端代码不需要知道该对象是否是a的子类并且不应该关心,因为b是一个a。见Liskov substitution principle。