我可以使用&#34; <! - 指定方法参数中的多个泛型必须是相同的类型吗?扩展类型 - >&#34;?

时间:2015-03-24 21:23:52

标签: java generics parameters

假设我有一个方法,例如

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

有没有办法可以指定previousListnewFilteredList的泛型类型和返回类型必须相同?例如:

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。

1 个答案:

答案 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>