Почему я должен добавить явное приведение при использовании универсального типа с параметризованным типом с подстановочными знаками? - PullRequest
0 голосов
/ 18 марта 2020

Вот код:

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()), это работает.

Почему это происходит ???

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...