通用集合作为Java方法参数

Gui*_*ido 2 java generics

有没有办法让这个工作在Java?

 public static void change(List<? extends Object> list, int pos1, int pos2) {
  Object obj = list.get(pos1);
  list.set(pos1, list.get(pos2));
  list.set(pos2, obj);
 }
Run Code Online (Sandbox Code Playgroud)

我成功避免警告和错误的唯一方法是:

 public static <T> T change(List<T> list, int pos1, int pos2) {
  T obj = list.get(pos1);
  list.set(pos1, list.get(pos2));
  list.set(pos2, obj);
  return obj;
 }
Run Code Online (Sandbox Code Playgroud)

但我不喜欢被迫返回一个值.

kro*_*old 8

制作通用方法

public static <T> void change( List<T> list, int position1, int position2) {
    T obj = list.get(position1);
    list.set(position1, list.get(position2));
    list.set(position2, obj);
}
Run Code Online (Sandbox Code Playgroud)


pol*_*nts 7

java.util.Collections,已经有了swap(List<?> list, int i, int j).

这是它在OpenJDK源代码中的实现方式:

public static void swap(List<?> list, int i, int j) {
   final List l = list;
   l.set(i, l.set(j, l.get(i)));
}
Run Code Online (Sandbox Code Playgroud)

有趣的是,它使用原始List类型来完成工作.代码在编译时生成警告,但可能是@authorJosh Bloch和Neal Gafter认为这是可以容忍的.