Что выведет следующий код?

package question;

class HasF {
    public void f() {
        System.out.println("HasF.f()");
    }
}

class Manipulators<T> {
    private T obj;
    public Manipulators(T x) {
        obj = x;
    }
    
    public void manipulation() {
        obj.f();
    }
}

public class Manipulation {
    public static void main(String[] args) {
        HasF hf = new HasF();
        Manipulators<HasF> manipul = new Manipulators<HasF>(hf);
        manipul.manipulation();
    }
}
Explanation
Из-за стирания компилятор Java не может сопоставить требование о возможности вызова f() для obj из manipulate() с тем фактом, что HasF содержит метод f(). Чтобы вызвать f(), нужно помочь параметризованному классу, и передать ему ограничения, компилятор принимает только те типы которые соответствуют данному ограничению.
В нашем случае: Manipulators<T extends HasF>

Следи за CodeGalaxy

Мобильное приложение Beta

Get it on Google Play
Обратная Связь
Продолжайте изучать
тесты по Java
Cosmo
Зарегистрируйся сейчас
или Подпишись на будущие тесты