Java泛型方法有一种写法是这样的public <T extends X> void Test(T t) {...}
这种方式是不是和public void Test(X t) {...}效果是一样的?那么搞出来这种泛型方式有什么用呢?

解决方案 »

  1.   

    泛型的作用有很多:1) 可以限制某个类必须继承某个类才能使用如<T extends X> 
      如果T不是继承X就不能当作返回值
    2)在集合类广泛 使用泛型 List<String> a= new ArrayList<String>();
    如果你这样定义就不能把其他类型添加到该集合里。
      

  2.   

    第一个的意思是:先说明T与X是一种子父类的关系,然后传给Test方法一个T的引用作为形式参数,所以,对下面的程序起到一定的指示作用,
    第二个的意思就简单的认为传给Test方法一个X的引用t作为形式参数,没有继承关系
      

  3.   

    感谢关注,我的意思是比方这样写public <T extends Runnable> Test1(T t) {...}和public void Test(Runnable t) {...}两种方式都可以接受实现Rnnable接口的类型参数,在我看起来没有区别。
      

  4.   

    、对于lz的意思,我想是这样的,总结为以下几点:
    1. Runnable是一个接口,应用实现而不是继承
    2. 假若父类X能够被子类T继承,T可以重写X中的一个方法,也可以几个,是任意选择的,而实现某个接口,就必须重写它的所有方法,对于Runnable中只有一个run方法,所以对于lz说的没有区别是不对的,,首先假设Runnable是一个类(实际是接口)的话,在第一种语句中,t是T的引用,是Runnable子类的引用,可以调用run方法也可以不调用run方法,重要的是这个run方法可能会被重写,内容改变了,而第二种的t是Runnable的一个引用,调用的run方法就只能是Runnable自身的没被重写的run方法,是有区别的!!!
      

  5.   

    在这个例子中没有区别,因为T是extends X,所以参数改用X也能对应一切继承X的参数
    所以两种写法是等效的,可以通过方法签名来判断它们编译后(即泛型擦除后)是一致的
    比如
    public <T extends X> void Test(T t) {}
    public void Test(X t) {} //重载Test方法,编译时可发现会造成冲突而编译失败 一般在这种泛型应用中,带有返回值的方法更能显示泛型的优点比如
    public <T extends X> getX(Class<T> clazz) {
        retun (T)clazz.newInstance(); //方法内部作了转换,方法外不需要强行转换为实际的T
    }//如果改成
    public X getX(Class<? extends X> clazz) {
        return clazz.newInstance(); //方法内部没有转换,方法外部需要自己转换
    }
    //则外部需要自己转换
    targetClass t = (targetClass)getX(targetClass.class);显然,这种情况泛型就要简单明了多了