java泛型参数和Object参数的区别

测试

先定义一个泛型类

class main2<T extends Number>
{
    T a;

    public void setA(T a)
    {
        System.out.println("Tset");
    }

    public void setA(Object a)
    {
        System.out.println("Oset");
    }

}

再定义一个测试类

public class main1
{
    public static void main(String[] args) 
    {
        main2<Integer> main2=new main2<>();
        main2.setA(1);
    }
}

看一下测试结果
java泛型参数和Object参数的区别_第1张图片
没问题
下面重新实现一个main2

public class main1
{
    public static void main(String[] args)
    {
        main2<? extends Number> main2=new main2<Integer>();
        main2.setA(1);
        main2.setA(1.0);
    }
}

运行一下
java泛型参数和Object参数的区别_第2张图片
都是调用的第二个方法
将第二个方法注释掉,编译器直接报错,无论如何第一个方法都不会再被调用

结论

当我们在使用< ? extends A>通配符时,可以使得泛型具有向上转型的功能,但是我们将丢失任何传递对象的能力,甚至传入Object也不行,编译器也将拒绝任何具有泛型参数的方法的调用。此时就可以使用Object参数来进行设计。

你可能感兴趣的:(java,python,Object,泛型,设计模式)