Так вот что подразумевается, когда в учебнике написано
Я думаю, что да, хотя есть пара ошибок, когда дело доходит до <>
операторов.
В вашем случае инстанцирование Box не является проблемой, учитывая, что тип может быть легко выведен с помощью аргумента конструктора. Попробуйте изменить конструктор на «not», взяв Integer
или T
, и посмотрите, как происходит сбой вызова.
class BadBox<T> {
private T t;
public BadBox(){}
public void setT(T t) {
this.t = t;
}
static void f(BadBox<Integer> box){}
public static void main(final String[] args) {
f(new BadBox<>()); //fails, should have worked ideally
}
}
Аналогично взгляните на этот класс:
class Testi<R> {
public void doIt(Set<? extends R> sets) {
}
public static void main(final String[] args) {
// works since type inference is now possible
new Testi<CharSequence>().doIt(new HashSet<>(Arrays.asList("a")));
// fails; nothing which can help with type inference
new Testi<CharSequence>().doIt(new HashSet<>();
}
}
Аналогичным образом, проблема в вашем связанном вопросе (относительно addAll
) может быть просто решена, если немного помочь компилятору следующим образом:
List<String> list = new ArrayList<>();
list.add("A");
// works now! use only if you love diamond operator ;)
list.addAll(new ArrayList<>(Arrays.asList(new String[0])));
// or the old-school way
list.addAll(new ArrayList<String>()));
Алмазные операторы также, кажется, ломаются, когда речь идет о реализации анонимных классов следующим образом:
final String[] strings = { "a", "b", "c" };
Arrays.sort(strings, new Comparator<>() {
@Override
public int compare(String o1, String o2) {
return 0;
}
});
К счастью, в этом случае компилятор довольно явно упоминает, что <>
не работает / не будет работать с анонимными классами.