如何从java中的方法返回不同类型的对象?

时间:2016-11-19 05:24:31

标签: java class object casting

我想问你一个方法如何在java中返回不同类型的对象?

假设我们有一个“a”类。 class 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”,则返回element的类型为“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方法中“get_element”之前要放什么。

为了能在“first_returned_object”中保存b型对象,在“second_returned_object”中保存c型对象,我应该放什么?

当然,这只是一个例子,我不会使用这些类,因为它们没用,但我写这篇文章是为了让我的问题尽可能简单。

我真正的课程,我有这种问题有5000多行,所以我不能在这里包括那些,所以我写了最简单的版本来证明我的问题。

有什么建议吗?

感谢名单。

post scriptum: 帽子锁定仇恨:你的仇恨在这里是双向的。 ;)

1 个答案:

答案 0 :(得分: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);
}