假设我有一个方法,例如
protected static List<? extends ObjectWithNameAndId> combineSelectedWithFilteredList(
String[] selectedRecordIds,
List<? extends ObjectWithNameAndId> previousList,
List<? extends ObjectWithNameAndId> newFilteredList) {
有没有办法可以指定previousList
,newFilteredList
的泛型类型和返回类型必须相同?例如:
protected static List<K extends ObjectWithNameAndId> combineSelectedWithFilteredList(
String[] selectedRecordIds,
List<K extends ObjectWithNameAndId> previousList,
List<K extends ObjectWithNameAndId> newFilteredList) {
因此,即使List<Foo>
和List<Foo>
都延伸/实施{{1},您也可以传入两个List<Bar>
,但不能传递一个Foo
和一个Bar
}}。如果你传入了两个ObjectWithNameAndId
,即使不知道实现,你也可以指望一个List<Foo>
退出,而不仅仅是一个扩展/实现List<Foo>
的任何类型的List。
答案 0 :(得分:4)
是的,您需要先声明类型参数:
protected static <K extends ObjectWithNameAnd> List<K> combineSelectedWithFilteredList(
String[] selectedRecordIds,
List<K> previousList,
List<K> newFilteredList) {}
有关完整详情和更多示例,请参阅https://docs.oracle.com/javase/tutorial/extra/generics/methods.html。
奖金:
如果要为方法指定多个泛型类型,它将如下所示:
public static <K extends ObjectWithName, C extends Collection<K>> C
truncateObjectNamesInCollection(C collection, int maxNameLength) {
上面的示例可以包含List<Type>
,它会返回List<Type>
或Set<ObjectWithNameAndId>
,它会返回Set<ObjectWithNameAndId>