遗产代码对遗传代码的好处是什么:

时间:2013-07-01 06:28:44

标签: java generics

我在docs.oracle网站上看到以下没有泛型的代码片段需要转换:

List list = new ArrayList();
list.add("hello");
String s = (String) list.get(0);

但如果我用Generics编写代码,那么它仍然容易出错:

List<Object>= new List<Object>;
list.add("hello");
String s=(String)list.get(0);

什么是仿制药的真正用途.... :( thnx提前..

4 个答案:

答案 0 :(得分:4)

List<Object>= new List<Object>;
list.add("hello");
String s=(String)list.get(0);

应该是

List<String>= new ArrayList<String>();    // this is now a list of String, not a list of object
     ^^^^^^                 ^^^^^^
list.add("hello");
String s=list.get(0);    // no casting needed
         ^

您可以按照所需的类型进行参数化。您的示例有2种方法可以执行相同的操作,因为您可以通过最基本的类进行参数化。

泛型的优点是你可以在这里编写更具体的类,String。这为您提供了更好的类型安全性,可以在编译期间尽早捕获错误。这可以防止因铸造方法而产生的问题。

答案 1 :(得分:3)

使用泛型使您的代码类型安全。您可以阻止ClassCastException

答案 2 :(得分:3)

假设您要存储名称列表(字符串)

List listNames = new ArrayList();
listNames.add("Durgesh");//ok

但我也可以添加一个整数

listNames.add(5000);//storing int instead of string

现在这样做

String name2=listNames.get(1);//throws exception{int->string}

如果没有泛型,您可以向集合添加无效类型,这可能会破坏您的代码。


使用泛型,您可以解决问题

List<String> listNames = new ArrayList();
listNames.add("Durgesh");
listNames.add(3000);//would through error at compile time

因此,泛型提供 typesafety


使用List<Object>打算将任何类型的Object.Due添加到Object参数,它将允许您添加任何类型的对象(string,int)。


如果x可以转换为y或者y可以转换为x,则List<x>也不能被=}指向List<y>,反之亦然。它们都应该是x或者因此提供类型安全

因此,您无法=List<String>分配给List<Object>,反之亦然。

答案 3 :(得分:1)

泛型用于在编译时检测运行时异常。

假设您创建了List来存储Strings并将其传递给方法.. enhanceList(List) ..并且在执行之后,您将遍历列表并获取所有字符串

在genercis 之前

enhanceList(List)方法可能会将其他类型的对象添加到列表中,从而创建可能的ClassCastException

void someMethod() {
   List listOfStrings = new List();
   enhanceList(listOfStrings);

   for(Iterator i : listOfStrings.iterator(); i.hasNext();) {
        String s = (String) i.next(); //RuntimeException here
   }
}

void enhanceList(List l) {
    l.add(new Integer(1)); //error code
}

使用泛型,您可以“绑定”列表中包含的对象类型

void someMethod() {
   List<String> listOfStrings = new List<String>();
   enhanceList(listOfStrings);

   for(String s : listOfStrings) {
       //no error here
   }
}

void enhanceList(List<String> l) {
    l.add(new Integer(1)); //compile-time error
}

但是,应该谨慎使用泛型,List<Object>对绑定类型没有多大帮助,因为它可以包含任何对象(因为Object是所有java类的超类)。我建议始终创建特定类型的列表。