Параметр Generics расширяет другой параметр метода Java

#java #generics

#java #generics

Вопрос:

Извините, может быть, это глупый вопрос, но я не могу найти ответа.

Два параметра generics в методе, может ли один расширять другой?

 public class A {
}

public class B extends A {
}

public class C {
}

public class Foo {

    public static <R extends A> void f1 (A t, R r){
    }

    // T and R are generics parameter, R bounds on T
    public static <T, R extends T > void f2(T t, R r) {
    }

    public static void main(String[] args) {

        A a = new A();
        B b = new B();
        C c = new C();

        Foo.f1(a, b); // no error
        Foo.f1(a, c); // compile error, it's ok

        Foo.f2(a, b); // no error
        Foo.f2(a, c); // no error !  why? 
   }
}
  

Последний f2 вызов метода не имеет ошибки компиляции, но я думаю C , что это не подкласс A , должна возникнуть ошибка компиляции. Любая помощь?

Комментарии:

1. Как вы думаете T , почему? A

Ответ №1:

Поскольку параметры типа в вашем коде, в котором вы вызываете метод, являются неявными, и, например, если компилятор Java выводит T и R Object , это нормально, не так ли? Но если вы объявляете их явными, это вызывает ошибку:

  Foo.<A, C>f2(a, c); //error as you wished
 Foo.<Object, Object>f2(a, c); //no errors and it's ok, isn't it?