虽然我知道,泛型用于使我们的代码更加通用和灵活。
但它cast iron guarantee
的作用generics
和保证是什么?
编辑:由于在采访中被问到这个问题,所以后来我也在网上搜索,但只找到一个铸铁社区,但与这种保证没有任何关系。
cast-iron guarantee
说,在类型擦除期间,编译器为泛型插入的类型转换保证永远不会失败,因为在编译期间没有未经检查的警告。
这基本上意味着编译器在泛型编译期间插入的所需类型转换永远不会ClassCastException
在运行时导致 a 在编译期间没有未经检查的警告。
更确切地说——
铸铁保证:泛型编译添加的隐式转换永远不会失败。
取自Java 泛型和集合。
其他问题解释了这意味着什么。我只想指出,所谓的“铸铁”保证有几个例外:
如果您的代码库1包含执行不安全转换的语句等(无论您是否看到消息,或者是否抑制它们),那么这可能会导致堆污染。
如果您的代码库使用反射对泛型对象执行操作,则可能会导致堆污染。
在任何一种情况下,这种堆污染都会导致 ClassCastExceptions。
请注意,“铸铁保证”一词不会出现在任何 Oracle 文档中。这似乎是一本流行教科书的发明……
1 - 堆污染可能发生在您的 sode 正在使用的库代码中。
保证是编译器将确保所有通用对象都是指定的具体对象。
ClassCastException
在实践中,这意味着你在处理泛型时永远不会得到一个。
如果没有泛型,则需要不安全的显式强制转换。使用泛型,可以进行隐式安全强制转换。
来自“ Java 泛型和集合”一书:
铸铁保证:泛型编译添加的隐式转换永远不会失败
铸铁保证是您可以完全信任/依赖的东西。对您的问题感到好奇的是,Java 泛型不提供类型安全的铸铁保证。只是一个有条件的。
所以,你需要指出你在哪里找到了表达来理解上下文。
- Generics
可以在 , 上实现,variables
但它是专门为类型安全而设计的。classes
methods
collections
-当Generics
没有引入时,任何特定类型的对象都会进入集合内部,并以 Object 类型出现。
例如:
ArrayList arr = new ArrayList();
arr.(new Dog);
Dog d = (Dog) arr.get(0); // Explicit cast is required to get the specific type of object
-随着 的引入Generics
,我们确信当a specific type goes into the collection it comes out as that same specific type.
ArrayList arr = new ArrayList();
arr.(new Dog);
Dog d = arr.get(0); // No casting required.
- 铸铁保证意味着,所有通用类型都将是相同的特定类型。
-使用泛型将确保在 期间
不会出现类型转换异常runtime
,因为此转换问题是在编译时本身处理的。