在Java泛型类中排除params

时间:2015-01-24 14:22:05

标签: java generics

我有三个班级:A,B和C. C 延伸 B B 延伸 A < / strong>即可。 我还使用以下代码获得了通用类 indClass2

indClass2.java

package myproject;

public class indClass2 <T extends A> {

    static void hello(indClass2<? super B> a){
        System.out.println("hello from super B");
    }
    static void hello(indClass2<? extends B> a){
        System.out.println("hello from extends B");
    }

}

indClass2<? super B>indClass2<? extends B>互相排斥。

helloworld.java

package myproject;

public class helloworld {

    public static void main(String[] args) {
        indClass2<A> a = new indClass2<A>();
        indClass2<B> b = new indClass2<B>();
        indClass2<C> c = new indClass2<C>();

        indClass2.hello(a);
        indClass2.hello(b);
        indClass2.hello(c);

    }
}

我有例外:

Exception in thread "main" java.lang.Error:
Unresolved compilation problem:
The method hello(indClass2<? super B>) in the type indClass2 is not applicable for the arguments (indClass2<C>)

    at myproject.helloworld.main(helloworld.java:12)

我怎样才能在 indClass2 中认识到hello()

2 个答案:

答案 0 :(得分:0)

如果您编译代码,您可以看到erasure代理:)

error: name clash: hello(indClass2<? extends B>) and hello(indClass2<? super B>) have the same erasure
    static void hello(indClass2<? extends B> a){

答案 1 :(得分:-2)

  

indClass2<? super B>indClass2<? extends B>互相排斥。

看起来它们彼此排斥,但在Java World中却没有!

这两个都具有相同的擦除,并且这些方法具有完全相同的签名,因此您将收到编译错误。

name clash: hello(indClass2<? extends B>) and hello(indClass2<? super B>) 
have the same erasure

如果您这样做是为了了解/了解有关Java或Type Erasure的更多信息,请阅读官方文档:

或者在此Blog: Type Erasure

中进行深入分析