使用此通用元组类
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...
的行都运行-类型似乎正确,并且操作甚至可以使用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
我也很奇怪为什么会发生这种情况。
使用此通用元组类公共类Pair
在运行时将删除添加到Pair类的数据类型。编译器只知道从getFirst()
和getSecond()
出来的数据是扩展Object
的
我对为什么会这样感到困惑