gpt4 book ai didi

方法调用中的Java 7 Diamond Operation

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:23:41 28 4
gpt4 key购买 nike

这是讨论的后续问题:

Why doesn't the diamond operator work within a addAll() call in Java 7?

来自 Java 教程,

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

Note that the diamond often works in method calls; however, for greater clarity, it is suggested that you use the diamond primarily to initialize a variable where it is declared

所以,我对第一行有点困惑。什么时候钻石在方法调用中起作用?

可以在此处找到有关钻石运算符如何工作的更多解释:

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){}

像下面这样的调用可以正常编译:

f(new Box<>(new Integer(10)));

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

这就是教程说的意思

Note that the diamond often works in method calls

如果没有,任何人都可以提供一个示例,说明钻石在方法调用中起作用吗?

最佳答案

So is this what is meant when the tutorial says

我认为是的,尽管在 <> 方面有一些问题。运营商。

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

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;
}
});

幸运的是,在这种情况下,编译器非常明确地提到了 <>不/不会与匿名类一起工作。

关于方法调用中的Java 7 Diamond Operation,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8637581/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com