Java泛型类型安全

Java泛型类型安全,java,Java,我曾经读到,Java泛型通过使所有类型转换隐式和自动,带来了以前在处理对象引用和包括显式类型转换时错过的类型安全。我研究了泛型并理解了它的机制,但我仍然看不到自动生成的隐式类型转换如何比泛型之前使用的显式类型转换带来类型安全性——我的意思是,我仍然可以使用显式类型转换并实现同样的效果 泛型似乎简单地简化了这个过程,它将程序员的唯一编程方法变成了语言的一个特性,通过真正为程序员处理/调整代码来简化这个过程 但我仍然看不到如何自动生成隐式强制转换 使类型安全性优于以前使用的显式强制转换 仿制药- 在

我曾经读到,Java泛型通过使所有类型转换隐式和自动,带来了以前在处理对象引用和包括显式类型转换时错过的类型安全。我研究了泛型并理解了它的机制,但我仍然看不到自动生成的隐式类型转换如何比泛型之前使用的显式类型转换带来类型安全性——我的意思是,我仍然可以使用显式类型转换并实现同样的效果

泛型似乎简单地简化了这个过程,它将程序员的唯一编程方法变成了语言的一个特性,通过真正为程序员处理/调整代码来简化这个过程

但我仍然看不到如何自动生成隐式强制转换 使类型安全性优于以前使用的显式强制转换 仿制药-

在原始类型中没有自动生成的隐式转换(向下转换),必须从
对象
显式转换到特定类型,因为原始类型可以接受任何
对象
,问题就在这里

例如,这里您没有类型安全设置,因为您可以将功能上只包含
字符串的任何内容放入列表中

List listOfString = new ArrayList();
listOfString.add("myString"); // compile 
listOfString.add(5); // compile (not a String)
String expectedStringButNot = (String) listOfString.get(1); // ClassCastException at runtime
对于泛型,您的类型安全设置为,您不能在功能上只包含
字符串的列表中放置任何内容,因为编译器将在以下时间之前停止:

List<String> listOfString = new ArrayList<>();
listOfString.add("myString"); // compile 
listOfString.add(5); // doesn't compile (not a String)
List listOfString=new ArrayList();
listOfString.add(“myString”);//编撰
listOfString.add(5);//不编译(不是字符串)
但我仍然看不到如何自动生成隐式强制转换 使类型安全性优于以前使用的显式强制转换 仿制药-

在原始类型中没有自动生成的隐式转换(向下转换),必须从
对象
显式转换到特定类型,因为原始类型可以接受任何
对象
,问题就在这里

例如,这里您没有类型安全设置,因为您可以将功能上只包含
字符串的任何内容放入列表中

List listOfString = new ArrayList();
listOfString.add("myString"); // compile 
listOfString.add(5); // compile (not a String)
String expectedStringButNot = (String) listOfString.get(1); // ClassCastException at runtime
对于泛型,您的类型安全设置为,您不能在功能上只包含
字符串的列表中放置任何内容,因为编译器将在以下时间之前停止:

List<String> listOfString = new ArrayList<>();
listOfString.add("myString"); // compile 
listOfString.add(5); // doesn't compile (not a String)
List listOfString=new ArrayList();
listOfString.add(“myString”);//编撰
listOfString.add(5);//不编译(不是字符串)

回答您的问题:实际上,泛型的设计目的是提供额外的编译时检查。比这更强大的是,泛型类型在运行时被擦除。它们没有为Java本身提供额外的“功能”

泛型类型“替换”了一些在泛型不存在时需要的类型转换

// My list of strings
List list = new ArrayList();
list.add("Hello");
String str1 = list.get(0); // Won't work
String str2 = (String) list.get(0);
编译器只是不确定列表是否只包含String对象,尽管程序员确定他只在列表中放入字符串

// My list of strings
List<String> list = new ArrayList<>(); // <> means <String> in this case
list.add("Hello");
String str1 = list.get(0); // works
String str2 = (String) list.get(0); // The typecast is unnecessary,
                                    // for the compiler already knows
                                    // that the list could only contain
                                    // strings
//我的字符串列表
List List=新建ArrayList();//在这种情况下是指
添加(“你好”);
字符串str1=list.get(0);//作品
String str2=(String)list.get(0);//排版是不必要的,
//因为编译器已经知道了
//列表中只能包含
//弦

因此,在第一个代码片段中,必须将typecast转换为
String
,因为您只需从列表中获得一个
对象。但是,在第二个代码段中,类型转换是不必要的。

回答您的问题:实际上,泛型的设计目的是提供额外的编译时检查。比这更强大的是,泛型类型在运行时被擦除。它们没有为Java本身提供额外的“功能”

泛型类型“替换”了一些在泛型不存在时需要的类型转换

// My list of strings
List list = new ArrayList();
list.add("Hello");
String str1 = list.get(0); // Won't work
String str2 = (String) list.get(0);
编译器只是不确定列表是否只包含String对象,尽管程序员确定他只在列表中放入字符串

// My list of strings
List<String> list = new ArrayList<>(); // <> means <String> in this case
list.add("Hello");
String str1 = list.get(0); // works
String str2 = (String) list.get(0); // The typecast is unnecessary,
                                    // for the compiler already knows
                                    // that the list could only contain
                                    // strings
//我的字符串列表
List List=新建ArrayList();//在这种情况下是指
添加(“你好”);
字符串str1=list.get(0);//作品
String str2=(String)list.get(0);//排版是不必要的,
//因为编译器已经知道了
//列表中只能包含
//弦
因此,在第一个代码片段中,必须将typecast转换为
String
,因为您只需从列表中获得一个
对象。然而,在第二个代码段中,类型转换是不必要的。

考虑一下这个例子

HashMap<String, Integer> map = new HashMap<String, Integer>();
Set<String> st = map.keySet(); // This will only contain String objects
在这里,编译时错误将识别问题,因此可以避免数小时的调试。

考虑这个例子

HashMap<String, Integer> map = new HashMap<String, Integer>();
Set<String> st = map.keySet(); // This will only contain String objects

在这里,编译时错误将识别问题,因此可以避免数小时的调试。

安全气囊和安全带使汽车更安全。当然,你不能系上安全带并禁用安全气囊-这就是你说的吗?我说的是,所谓的类型安全性似乎可以在没有仿制药的情况下实现,泛型似乎带来的唯一好处是将编程实践的知识写进语言的一个功能中,这个功能可以通过语言的一些新语法元素轻松访问,也就是说,没有什么比新的类型安全级别更新颖了。安全气囊和安全带使汽车更安全。当然,你不能系上安全带并禁用安全气囊-这就是你说的吗?我说的是,所谓的类型安全性似乎可以在没有仿制药的情况下实现,泛型似乎带来的唯一好处是将编程实践的知识写进语言的一个特性中,这个特性可以通过语言的一些新的语法元素轻松访问,也就是说,没有什么比新的类型安全级别更新颖的了。谢谢。但这并不是什么新鲜事,它展示了泛型仅仅是如何强制类型安全的(