Вот код:
public class Pair<X,Y> {
private X first;
private Y second;
public Pair(X x, Y y) {
first = x;
second = y;
}
public X getFirst() { return first; }
public Y getSecond() { return second; }
public void setFirst(X x) { first = x; }
public void setSecond(Y y) { second = y; }
}
final class Test {
public static void main(String[] args) {
String a = "a";
Pair<?,?> pair = new Pair<String,Long>("limit", 10000L);
String s = pair.getFirst();
}
этот код не работает, поскольку объект, возвращаемый методом getFirst()
, не может быть преобразован в строку:
Test.java:5: error: incompatible types: CAP#1 cannot be converted to String
String s = pair.getFirst();
^
where CAP#1 is a fresh type-variable:
CAP#1 extends Object from capture of ?
1 error
It кажется, что компилятор добавил неявное приведение, но не смог.
Но когда я добавляю явное приведение (String s = (String)pair.getFirst()
), это работает.
Почему это происходит ???