在this answer我試圖創建一個靜態實用方法,使一個List
成Map
:通用靜態方法限制類型太多
public static <K, T> Map<K, T> toMapBy(List<T> list,
Function<? super T, ? extends K> mapper) {
return list.stream().collect(Collectors.toMap(mapper, Function.identity()));
}
它工作得很好。但是,我發現該方法不能與list.stream().collect(...)
表達式在所有相同的上下文中使用。該方法不夠靈活。
List<Student> students = Arrays.asList();
Map<Long, Student> studentsById1 = students.stream()
.collect(Collectors.toMap(Student::getId, Function.identity()));
Map<Long, Student> studentsById2 = toMapBy(students, Student::getId);
Map<Long, Person> peopleById1 = students.stream()
.collect(Collectors.toMap(Student::getId, Function.identity()));
Map<Long, Person> peopleById2 = toMapBy(students, Student::getId); // compile error!
在這個例子中,是Student
的Person
亞型和具有getId
方法,它返回一個Long
。
最後一條語句失敗,出現incompatible types: inference variable T has incompatible bounds ...
(JDK 1.8.0_25)。有沒有一種方法來定義類型參數,以便靜態方法與其包含的表達式在相同的上下文中工作?
[is-listdog-a-subclass-of-listanimal-why-arent-javas-generics-implicitly-polymorphic?](http://stackoverflow.com/questions/2745265/is-listdog-a-subclass-的-listanimal - 爲什麼 - ARENT-Java類,泛型隱-p)。 'Map'不能被引用到返回的'Map '。也許考慮使用'Map '。 –
Pshemo
2014-11-01 18:05:32
如果你可以使用'Map'Map '的實例,那麼這意味着通過這樣的引用你可以在這張地圖上放置任何類型的人,不僅是學生(換句話說泛型不是協變的)。 –
Pshemo
2014-11-01 18:15:04