Почему не импортирует java.util. * Include Массивы и списки?
Я использую java на debian 5
java-версия "1.6.0_20"
Java (TM) SE Runtime Environment (сборка 1.6.0_20-b02)
Клиентская виртуальная машина Java HotSpot (TM) (сборка 16.3-b01, смешанный режим, совместное использование)
Почему существует разница между следующими
Случай 1:
import java.util.*;
Случай 2:
import java.util.*;
import java.util.Arrays;
import java.util.List;
Почему первый случай не покрывает второй случай?
Код компилируется только при явном импорте массивов и списка.
код:
import java.util.*;
import java.util.Arrays;
import java.util.List;
public class Test {
public static void main (String[] args) {
List<Integer> i = new ArrayList(Arrays.asList(1,2,3,4,5,6,7,8,9,10));
List<Integer> j = new ArrayList();
ListIterator<Integer> n = i.listIterator(i.size());
while(n.hasPrevious()) {
j.add(n.previous());
}
println(j);
}
static void println(Object o) {
System.out.println(o);
}
static void print(Object o) {
System.out.print(o);
}
}
Ошибка, возникающая при компиляции 2-го и 3-го операторов импорта:
[email protected]:~/dev/java$ javac Test.java
Test.java:7: cannot find symbol
symbol : method asList(int,int,int,int,int,int,int,int,int,int)
location: class Arrays
List<Integer> i = new ArrayList(Arrays.asList(1,2,3,4,5,6,7,8,9,10));
^
Note: Test.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
1 error
[email protected]:~/dev/java$
Ответы
Ответ 1
Я только что скомпилировал его, и он компилируется без имплицированного импорта, возможно, вы видите устаревший кеш или что-то вроде вашей IDE.
Вы пытались выполнить компиляцию из командной строки?
Я имею ту же самую версию:
![here it is]()
Вероятно, вы думаете, что предупреждение является ошибкой.
UPDATE
Похоже, у вас есть файл Arrays.class
в каталоге, в котором вы пытаетесь скомпилировать (вероятно, созданный ранее). Вот почему явный импорт решает проблему. Попробуйте скопировать исходный код в чистый новый каталог и повторите попытку. На этот раз вы не увидите ошибки. Или очистите рабочий каталог и удалите Arrays.class
Ответ 2
Разница между
import java.util.*;
и
import java.util.*;
import java.util.List;
import java.util.Arrays;
становится очевидным, когда код относится к некоторым другим List
или Arrays
(например, в том же пакете или вообще импортирован). В первом случае компилятор будет считать, что Arrays
, объявленный в том же пакете, тот, который будет использоваться, в последнем, поскольку он объявлен специально, будет использоваться более конкретный java.util.Arrays
.
Ответ 3
Случай 1 должен был сработать. Я не вижу ничего плохого. Могут быть и другие проблемы. Я бы предложил чистую сборку.
Ответ 4
Взгляните на этот форум http://htmlcoderhelper.com/why-is-using-a-wild-card-with-a-java-import-statement-bad/. Theres обсуждение того, как использование подстановочных знаков может привести к конфликтам, если вы добавите новые классы в пакеты, и если в разных пакетах есть два класса с одинаковым именем, в которые будет импортировано только одно из них.
Обновление
Он дает это предупреждение, потому что ваша строка должна быть
List<Integer> i = new ArrayList<Integer>(Arrays.asList(0,1,2,3,4,5,6,7,8,9,10));
List<Integer> j = new ArrayList<Integer>();
Вам нужно указать тип списка массивов, или компилятор даст это предупреждение, потому что он не может определить, что вы используете этот список безопасным способом.