我可以使用“<? 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) {
有什么方法可以指定 previousList
、newFilteredList
和 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>
,即使 Foo
和 Bar
都 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>
假设我有一个方法,比如
protected static List<? extends ObjectWithNameAndId> combineSelectedWithFilteredList(
String[] selectedRecordIds,
List<? extends ObjectWithNameAndId> previousList,
List<? extends ObjectWithNameAndId> newFilteredList) {
有什么方法可以指定 previousList
、newFilteredList
和 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>
,即使 Foo
和 Bar
都 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>