如何使这个Java方法通用

时间:2017-05-11 20:22:36

标签: java oop generics methods generic-collections

我有一个java方法,我正在尝试制作通用的,以便它可以将2种不同类型的对象列表作为参数。 (如下所示的琐碎例子)。这两个不同的对象都将始终具有方法getDate()和getHour()。代码如下所示:

public <T> List<T> getListOfStuff(List<T> statistics) {

    List<T> resultList = new ArrayList<T>(statistics.size());

    if(statistics.size() > 0){
        resultList.add(statistics.get(0));

        int date = Integer.parseInt(resultList.get(0).getDate());
        int hour = Integer.parseInt(resultList.get(0).getHour());
    }
    return resultList;
}

然而,这不起作用。这两行不起作用:

int date = Integer.parseInt(resultList.get(0).getDate());
int hour = Integer.parseInt(resultList.get(0).getHour());

错误说: “方法getDate()未定义为类型T”和 “对于类型T”

,方法getHour()未定义

它向我提出了向方法接收器添加强制转换的建议,但它不会让我使用T而是强制对象名称对我这样对我不起作用:

int date = Integer.parseInt((ObjectName1)resultList.get(0).getDate());
int hour = Integer.parseInt((ObjectName1)resultList.get(0).getHour());

有什么方法可以做我想要的吗?

2 个答案:

答案 0 :(得分:5)

您想要使用以下内容:

public <T extends ObjectName1> List<T> getListOfStuff(List<T> statistics) {
    List<T> resultList = new ArrayList<>(statistics.size());

    if (!statistics.isEmpty()) {
        resultList.add(statistics.get(0));

        int date = Integer.parseInt(resultList.get(0).getDate());
        int hour = Integer.parseInt(resultList.get(0).getHour());
    }

    return resultList;
}

现在唯一可以传递给此方法的List必须保留ObjectName1或扩展它的对象。

答案 1 :(得分:2)

您的方法指定使用类型T,所有编译器都知道它扩展为ObjectObject没有您调用的方法。您必须断言该类型具有您使用的方法。为此,您需要<T extends Foo>,其中Foo是具有这些方法的类型。

ObjectName1是可能类型的最差名称之一。