2015-01-14 3 views
0

Я помню декларацию что-то вроде следующего:Что такое поведение по умолчанию оператора алмазного

private static Logger log = Logger.getLogger(<>.class);

Преимущество в том, что он может быть вставлен из класса в класс, не случайно является регистратором для другого класс.

Теперь я не могу это скомпилировать, синтаксис должен быть неправильным. Итак, что именно делает <> решить самостоятельно (не ArrayList <>() и т. Д.)?

Спасибо

Обновление:

Мое утверждение, что он является законным синтаксис происходит от:

  1. Я видел его на веб-сайте в качестве юридического и изящным трюком.
  2. И я, и его коллега вставляли его в IntelliJ с Java 7, и он скомпилирован правильно.

Это не работает, я не могу найти поиск, который снова приведет меня к этой странице, и я не могу его скомпилировать сейчас! Поэтому я надеюсь, что кто-то, кто обладает знаниями о компиляторе или Java, может окончательно сказать, действительно ли он действителен и каков он по умолчанию.

+1

Ничего. Это синтаксически неверно. –

+2

Насколько я знаю, '<>. Class' не является и никогда не был законным. Оператор алмаза (представленный на Java 7) используется только в вашем последнем примере ('new ArrayList <>()'), чтобы указать, что должны быть выведены параметры типового типа для вызовов конструктора.(Отсутствие оператора алмаза указывает на построение необработанного типа.) –

+0

Я думаю, что некоторые IDE могут скрыть тип с этим синтаксисом, но он все еще на самом деле там? –

ответ

3

Назад на Java 5 и 6, когда вам нужно было объявить новый экземпляр общего класса *, вам пришлось использовать следующий синтаксис.

List<String> myList = new ArrayList<String>(); 

Не было никакого вывода типа во время объявления для дженериков.

С появлением Java 7 компилятор узнал об уловке или двух о типе вывода.

Если компилятор может вывести его, а затем с помощью оператора алмазной <> как это называется будет производить тот же результат в Java 7 и выше, как приведенный выше код:

List<String> myList = new ArrayList<>(); 

Есть ситуации, конечно , где он не может. Это заимствовано из приведенного выше примера.

List<String> list = new ArrayList<>(); 
list.add("A"); 
// The following statement should fail since addAll expects 
// Collection<? extends String> 

list.addAll(new ArrayList<>()); 

То, что вы получили здесь неверный код:

private static Logger log = Logger.getLogger(<>.class); 

Вы на самом деле нужно передать конкретный Class этому методу, и Java не собирается быть в состоянии сделайте это для вас в этом контексте.

*: Я не помню, было ли это так плохо с помощью общих методов, но я не делал много развития с Java 6 в тот же день.