我可以使用“<? extends Type>”指定方法参数中的多个泛型必须是同一类型吗?

Can I specify that multiple generics in a method parameter must be the same type using "<? extends Type>"?

假设我有一个方法,比如

protected static List<? extends ObjectWithNameAndId> combineSelectedWithFilteredList(
    String[] selectedRecordIds,
    List<? extends ObjectWithNameAndId> previousList,
    List<? extends ObjectWithNameAndId> newFilteredList) {

有什么方法可以指定 previousListnewFilteredList 和 return 的泛型类型必须相同?例如:

protected static List<K extends ObjectWithNameAndId> combineSelectedWithFilteredList(
    String[] selectedRecordIds,
    List<K extends ObjectWithNameAndId> previousList,
    List<K extends ObjectWithNameAndId> newFilteredList) {

因此您可以传入两个 List<Foo>,但不能传入一个 List<Foo> 和一个 List<Bar>,即使 FooBar 都 extend/implement ObjectWithNameAndId。如果你传入两个 List<Foo>,即使不知道实现,你也可以指望得到一个 List<Foo> 返回,而不仅仅是一个包含 extend/implement [=19= 的任何类型的列表].

是的,您需要先声明类型参数:

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> 并且它会 return List<Type>,或者一个 Set<ObjectWithNameAndId> 并且它会 return Set<ObjectWithNameAndId>