泛型参数扩展了java方法上的另一个参数

泛型参数扩展了java方法上的另一个参数,java,generics,Java,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

对不起,也许这是个愚蠢的问题,但我找不到答案

一个方法上有两个泛型参数,一个可以扩展另一个吗

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? 
   }
}
公共A类{
}
公共类B扩展了A{
}
公共C类{
}
公开课Foo{
公共静态空隙f1(A t,R R){
}
//T和R是泛型参数,T上的R界
公共静态空隙f2(T,R){
}
公共静态void main(字符串[]args){
A=新的A();
B=新的B();
C=新的C();
Foo.f1(a,b);//没有错误
f1(a,c);//编译错误,没有问题
f2(a,b);//没有错误
f2(a,c);//没有错误!为什么?
}
}

最后一个
f2
方法调用没有编译错误,但我认为
C
不是
A
的子类,应该出现编译错误。有什么帮助吗?

因为调用方法的代码中的类型参数是隐式的,例如,如果java编译器将
T
R
推断为
对象
,这很好,不是吗?但如果您将它们声明为显式,则会引发错误:

 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?
Foo.f2(a,c)//如你所愿
Foo.f2(a,c)//没有错误也没关系,不是吗?

你为什么认为
T
A