Java 当我们可以对对象类进行转换时,为什么需要泛型?

Java 当我们可以对对象类进行转换时,为什么需要泛型?,java,object,generics,Java,Object,Generics,java中有泛型,我们可以使用泛型来泛化类。 我知道对象类是每个类的父类 当我可以在对象之间进行类型转换时,为什么需要泛型呢 class Response<T>{ T data; } 上述两个代码片段的工作方式相同。在泛型存在之前,事情就是这样做的:当您不知道其特定类型时,您声明了类型为Object的对象 但是对象类型并不能说明什么,泛型的好处是现在我们知道了对象的类型,只要在编译时可能就知道了。阅读了解Java中泛型实现方式的局限性。强制转换(装箱和取消装箱)是一种昂贵的

java中有泛型,我们可以使用泛型来泛化类。 我知道对象类是每个类的父类

当我可以在对象之间进行类型转换时,为什么需要泛型呢

class Response<T>{
    T data;
}

上述两个代码片段的工作方式相同。

在泛型存在之前,事情就是这样做的:当您不知道其特定类型时,您声明了类型为
Object
的对象

但是
对象
类型并不能说明什么,泛型的好处是现在我们知道了对象的类型,只要在编译时可能就知道了。阅读了解Java中泛型实现方式的局限性。

强制转换(装箱和取消装箱)是一种昂贵的运行时操作。泛型不会产生运行时开销。

我可以用“pre-generic”的方式列出一个列表,然后做这样糟糕的事情。结果是,如果不借助反射,我无法知道从列表中获得的对象的类型

List myList = new ArrayList();
myList.add(new Integer(1));
myList.add(new Cat());

Object whatIsThis = myList.get(1);
对于泛型,我可以这么说

List<Cat> myList = new ArrayList();    
myList.add(new Cat());
myList.add(new Integer(1));  // compile time error
myList.add(new Dog()); // compile time error

Cat whatIsThis = myList.get(1); // I *know* this must be a Cat
List myList=new ArrayList();
myList.add(新的Cat());
myList.add(新整数(1));//编译时错误
myList.add(newdog());//编译时错误
Cat whatisithis=myList.get(1);//我知道,这一定是只猫

类型安全。而且你不再需要强制转换。我也读过相关的文章,“如果你可以继续使用Java 4,为什么还要使用Java(x>=5)?先别开玩笑了。泛型允许你在编译过程中发现问题,而不是在运行时观察
ClassCastException
。这个答案不正确。装箱和拆箱仍然发生在运行时。泛型仍然需要在运行时进行强制转换,只是您不必显式地编写它。@ÓscarLópez,我已经“更正”了答案。在你的链接中:“因此,生成的字节码只包含普通的类、接口和方法。”答案的要点是泛型的性能和类型安全性更好。只有当“如果类型参数是无界的”,编译器才会求助于
Object
,因此需要强制转换。
List<Cat> myList = new ArrayList();    
myList.add(new Cat());
myList.add(new Integer(1));  // compile time error
myList.add(new Dog()); // compile time error

Cat whatIsThis = myList.get(1); // I *know* this must be a Cat