suchen

Heim  >  Fragen und Antworten  >  Hauptteil

java - Warum muss der Quellcode für die Swap-Funktion in der Collections-Klasse eine neue endgültige Listenvariable l definieren, um auf die eingehende Liste zu verweisen?

Der

JDK1.7-Quellcode lautet wie folgt:

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

Was bedeutet dieser Satzfinal List l = list? Wäre es nicht dasselbe, wenn Sie die übergebene Liste direkt manipulieren würden?

Ich bin ein Neuling im Selbstlernen von Java, wenn ich das sehe. Ich hoffe, die Senioren können mir helfen, meine Verwirrung zu klären.

淡淡烟草味淡淡烟草味2789 Tage vor813

Antworte allen(1)Ich werde antworten

  • 漂亮男人

    漂亮男人2017-05-17 10:07:33

    试一下:

    import java.util.List;
    
    public class Test {
        public static void swap(List<?> list, int i, int j) {
            list.set(i, list.set(j, list.get(i)));
        }
    }

    编译错误:

    .\Test.java:7: 错误: 无法将接口 List<E>中的方法 set应用到给定类型;
            list.set(i, list.set(j, list.get(i)));
                            ^
      需要: int,CAP#1
      找到: int,CAP#2
      原因: 参数不匹配; Object无法转换为CAP#1
      其中, E是类型变量:
        E扩展已在接口 List中声明的Object
      其中, CAP#1,CAP#2是新类型变量:
        CAP#1从?的捕获扩展Object
        CAP#2从?的捕获扩展Object
    1 个错误

    因为list的类型是List<?>,不知道具体的类型,所以只能从列表里取出一Object,不能往列表插入。

    所以转成List。

    或者换成List<T>:

    public static <T> void swap(List<T> list, int i, int j) {...}

    Antwort
    0
  • StornierenAntwort