我有一个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());
有什么方法可以做我想要的吗?
答案 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
,所有编译器都知道它扩展为Object
。 Object
没有您调用的方法。您必须断言该类型具有您使用的方法。为此,您需要<T extends Foo>
,其中Foo
是具有这些方法的类型。
ObjectName1
是可能类型的最差名称之一。