1

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

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

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

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

那么泛型的真正用途是什么...... :( thnx提前......

4

4 回答 4

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
         ^

您可以根据需要的类型进行参数化。您的示例是做同一件事的两种方法,因为您通过最基本的类进行参数化。

泛型的优点是您可以在此处编写更特定于一个类的类String。这为您提供了更好的类型安全性,以便在编译期间及早发现错误。这可以防止由铸造方法引起的问题。

于 2013-07-01T06:30:11.207 回答
3

使用泛型使您的代码类型安全。你可以预防ClassCastException

于 2013-07-01T06:30:54.903 回答
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

所以,泛型提供了类型安全


如果您打算添加任何类型的 Object。由于List<Object>Object 参数,它将允许您添加任何类型的对象(字符串,int)。


如果x 可以转换为 y 或 y 可以转换为 x,List<x>也不能被分配(=),List<y>反之亦然。它们都应该是 x 或 y,从而提供类型安全

因此,您将无法( =)分配List<String>给,List<Object>反之亦然..

于 2013-07-01T06:34:49.990 回答
1

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

假设你创建了一个Listto storeStrings并将它传递给一个方法.. 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 类的超类)。我建议始终创建特定类型的列表。

于 2013-07-01T06:36:38.993 回答