【问题标题】:How to return different types of object from a method in java?如何从java中的方法返回不同类型的对象?
【发布时间】: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 如果您需要使用仅出现在 BC 上的方法或公共成员。
  • 只是对任何未来问题的注释,这个网站是为专业人士准备的。请在适当的时候使用 shift 键。
  • 如果你需要知道一个对象的具体类型,那么你的类结构就有缺陷。您可能想使用SOLID principles 重新设计它。
  • 返回a。这是唯一有意义的事情。您的客户端代码不需要知道该对象是否是a 的子类并且不应该关心,因为b 是一个 a。见Liskov substitution principle

标签: java class object casting


【解决方案1】:

您可以使用泛型来使返回类型动态化。

试试这个:

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);
}

【讨论】:

  • hay Skreweverything,谢谢您的回复。实际上,虽然我现在用 java 编程大约一年,但我更新使用泛型。实际上我什至不知道它们是什么,但是,我会立即在 java 文档中查找它。无论如何,关于你的帖子,嗯,非常感谢。这确实有效!如果我用你的方法替换我的 get_element 方法,我就不必再转换返回的对象了。谢谢,我将查找您的示例和有关泛型的文档,学习如何使用它,并在我的真实代码中实现它。 thanx,这只是这里有用的答案。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-11
  • 1970-01-01
  • 1970-01-01
  • 2015-02-05
  • 2012-01-24
  • 1970-01-01
相关资源
最近更新 更多