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

时间:2016-10-11 18:48:31

标签: 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 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 个答案:

答案 0 :(得分:3)

因为你调用方法的代码中的类型参数是隐式的,例如,如果java编译器推断TRObject就可以了,不是吗?但如果你明确声明它们会引发错误:

 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?