gpt4 book ai didi

Java 错误 : CAP#1, int 其中 CAP#1 是新的类型变量 : CAP#1 extends Object from capture of?

转载 作者:行者123 更新时间:2023-12-01 17:42:10 28 4
gpt4 key购买 nike

使用这个通用元组类

public class Pair< T1, T2 > {

private final T1 first;
private final T2 second;

public Pair(T1 first, T2 second) {
this.first = first;
this.second = second;
}

public T1 getFirst() {
return first;
}

public T2 getSecond() {
return second;
}

}

还有这个司机

public class PairDriver {

public static void main(String[] args) {

Pair<?, ?>[] s = new Pair<?, ?>[3];
s[0] = new Pair<String, Integer>("a", 1);
s[1] = new Pair<String, Integer>("b", 2);
s[2] = new Pair<String, Integer>("c", 3);

System.out.println( s[0].getFirst().getClass().getName() ); // Should be String
System.out.println( s[0].getSecond().getClass().getName() ); // Should be Integer

System.out.println( s[0].getFirst() );
System.out.println( s[0].getFirst() + "!!!" ); // Operation works

System.out.println( s[0].getSecond() );
System.out.println( s[0].getSecond() + 2 ); // Operation FAILS...
}

}

我收到以下错误:

pairDriver.java:17: error: bad operand types for binary operator '+'
System.out.println( s[0].getSecond() + 2 ); // Operation FAILS...
^
first type: CAP#1
second type: int
where CAP#1 is a fresh type-variable:
CAP#1 extends Object from capture of ?
1 error
error: compilation failed

我很困惑为什么会发生这种情况。直到标记为 // Operation FAILS... 的所有行run —— 类型看起来正确,操作甚至适用于 String ,但不适用于 Integer 。

作为后续:我看到有人通过替换通配符 ? 来修复类似的错误。与一个类型。我不明白为什么这在他们的情况下有效,但在这里不适用,因为用 Pair<String, Integer>[] s = new Pair<String, Integer>[3]; 等类型声明数组导致不同的错误:

pairDriver.java:5: error: generic array creation
Pair<String, Integer>[] s = new Pair<String, Integer>[3];
^
1 error
error: compilation failed

我很困惑也很好奇为什么会发生这种情况。

最佳答案

I'm confused as to why this happens

就编译器而言,您正在将一些对象添加到 int 中。

它没有更多信息,因为该对中第二个元素的类型是 ? (如 Pair<?, ?> )。它不再知道该值实际上是一个整数。

As a follow-up

由于类型删除,您无法创建具有不可具体化元素类型的数组。

可具体化类型是一种在运行时了解该类型的所有信息的类型。非泛型类型是可具体化的;所有类型参数均为通配符的泛型类型都是可具体化的;其他泛型类型则不然。

泛型和数组是一对不愉快的伙伴。如果您使用泛型,请使用 List相反。

List<Pair<String, Integer>> s = new ArrayList<>();
s.add(new Pair<String, Integer>("a", 1));
s.add(new Pair<String, Integer>("b", 2));
s.add(new Pair<String, Integer>("c", 3));

关于Java 错误 : CAP#1, int 其中 CAP#1 是新的类型变量 : CAP#1 extends Object from capture of?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59793861/

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