这就是教程说的意思吗
我认为是的,尽管在<>
运营商方面存在一些问题。
在您的情况下, Box 实例化不是问题,因为可以使用构造函数参数轻松推断类型。尝试将构造函数更改为“不”接受Integer
orT
并查看调用如何失败。
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;
}
});
幸运的是,在这种情况下,编译器非常明确地提到<>
不能/不会使用匿名类。