我怎样才能使下面的方法适用于任何实现String getValue()
接口的类?泛型可以做到吗?
private static void findUniqueEntriesInList(List<ColValueObject> list1,
List<ColValueObject> list2,
List<ColValueObject> result) {
for (ColValueObject l1 : list1) {
boolean found = false;
for (ColValueObject l2 : list2) {
if (l1.getValue().equals(l2.getValue())) {
found = true;
break;
}
}
if (!found) {
result.add(l1);
}
}
}
与:
class ColValueObject implements GetValueToStringObject {
private String base;
private String value;
// boilerplate omitted
}
我可以创建这个接口和方法:
public interface GetValueToStringObject {
String getValue();
}
以及:
private static void findUniqueEntriesInListUsingGenerics(List<GetValueToStringObject> list1,
List<GetValueToStringObject> list2,
List<GetValueToStringObject> result) {
for (GetValueToStringObject l1 : list1) {
boolean found = false;
for (GetValueToStringObject l2 : list2) {
if (l1.getValue().equals(l2.getValue())) {
found = true;
break;
}
}
if (!found) {
result.add(l1);
}
}
}
问题是我不能像这样直接调用这个方法:
findUniqueEntriesInListUsingGenerics(list1, list2, result);
1条答案
按热度按时间2w2cym1i1#
我不太清楚您要实现什么,但很明显,
List<GetValueToStringObject>
不是List<ColValueObject>
,反之亦然,并且由于GetValueToStringObject
和ColValueObject
之间没有实现(或扩展)关系,因此您的方法无法正常工作。做一些合理的假设,我认为您需要
ColValueObject
来实现GetValueToStringObject
,然后您可以使用泛型和<T extends GetValueToStringObject>
来完成您想要的任务:然后将方法实现为:
这样,所有的列表都必须有相同的泛型类型,请参见答案的末尾,以获得更灵活的解决方案。
顺便说一句,我认为
result
参数不属于您的方法,它应该返回一个在方法中创建的List<T>
。或者,如果希望
list1
、list2
和result
具有不同的类型,可以用途:这里
list1
被定义为实际类型,list2
可以是扩展(实现)GetValueToStringObject
的任何类型列表,并且result
可以是T
的任何超类/超接口的列表。例如,如果
list1
是List<ColValueObject>
,则result
可以是List<ColValueObject>
、List<GetValueToStringObject>
或List<Object>
,并且list2
可以是List<GetValueToStringObject>
、List<ColValueObject>
或List<SomeOtherTypeImplementingGetValueToStringObject>
。下面是另一个选项,但这将
result
的类型限制为仅List<GetValueToStringObject
和List<Object>
,我认为这比前面的解决方案用处更小: