方法调用中的Java 7 Diamond操作

Sa'*_*'ad 9 java diamond-operator java-7

这是一个关于讨论的后续问题:

为什么菱形运算符不能在Java 7中的addAll()调用中工作?

从Java教程中,

http://docs.oracle.com/javase/tutorial/java/generics/gentypeinference.html

请注意,钻石通常用于方法调用; 但是,为了更加清晰,建议您主要使用钻石来初始化声明它的变量

所以,我对第一行感到有点困惑.当确实在方法调用钻石的工作?

关于钻石操作员如何工作的更多解释可以在这里找到:

http://www.angelikalanger.com/GenericsFAQ/FAQSections/TechnicalDetails.html#What%20is%20type%20argument%20inference%20for%20constructors

从这个,我尝试了以下,这很好:

给我有:

private static class Box<T>{
    public Box(T t){}
}
static void f(Box<Integer> box){}
Run Code Online (Sandbox Code Playgroud)

像下面这样的调用编译好:

f(new Box<>(new Integer(10)));
Run Code Online (Sandbox Code Playgroud)

f()上面的方法调用中调用构造函数的类型参数是从构造函数的参数推断出来的(即Integer).

这就是本教程所说的意思

请注意,钻石通常用于方法调用

如果没有,任何人都可以提供钻石在方法调用中工作的示例吗?

San*_*rma 3

这就是教程所说的意思吗

我认为是的,尽管对于运营商来说存在一些问题<>

在您的情况下,Box 实例化不是问题,因为可以使用构造函数参数轻松推断出类型。尝试将构造函数更改为“不”接受IntegerorT并查看调用如何失败。

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
    }    
}
Run Code Online (Sandbox Code Playgroud)

同样,看看这个类:

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<>();
    }       
}
Run Code Online (Sandbox Code Playgroud)

同样,您链接的问题(关于)中的问题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>()));
Run Code Online (Sandbox Code Playgroud)

钻石运算符在实现匿名类时似乎也会出现问题,如下所示:

final String[] strings = { "a", "b", "c" };
Arrays.sort(strings, new Comparator<>() {
    @Override
    public int compare(String o1, String o2) {
        return 0;
    }
});
Run Code Online (Sandbox Code Playgroud)

幸运的是,在这种情况下,编译器非常明确地提到它<>不适用于匿名类。