我在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提前..
答案 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)
..并且在执行之后,您将遍历列表并获取所有字符串
,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类的超类)。我建议始终创建特定类型的列表。