虽然我知道,但泛型用于使我们的代码更加通用和灵活。
但cast iron guarantee
中的 generics
及其保证的是什么?
编辑:由于这个问题是我在采访中提出来的,所以后来我也在网上搜索,但只找到一个铸铁社区,但没有任何相关的保证。
答案 0 :(得分:8)
cast-iron guarantee
表示,在类型擦除期间,编译器为泛型插入的类型转换保证永不失败,因为在编译期间没有未经检查的警告。
它基本上意味着编译器在编译泛型期间插入的所需类型强制转换在运行时永远不会导致ClassCastException
,前提是在编译期间没有未经检查的警告。
更确切地说 -
铸铁保证:由汇编添加的隐式强制转换 仿制药永远不会失败。
答案 1 :(得分:2)
其他问题解释了这意味着什么。我只是想指出,所谓的“铸铁”保证有几个例外:
如果您的代码库 1 包含执行不安全转换的语句,等等(无论您是否看到消息,或者是否禁止它们),那么可能会导致堆污染。
如果你的代码库使用反射来对通用对象执行操作,那么可能会导致堆污染。
在任何一种情况下,此heap pollution都可能导致ClassCastExceptions。
请注意,任何Oracle文档中都没有出现“cast-iron guarantee”这一短语。这似乎是一本流行教科书的发明......
1 - 堆污染可能发生在你的sode正在使用的库代码中。
答案 2 :(得分:1)
保证是编译器将确保所有通用对象都具有指定的具体对象。
在实践中,这意味着在处理泛型时你永远不会得到ClassCastException
。
如果没有泛型,则需要不安全的显式强制转换。使用泛型,隐式安全强制转换。
答案 3 :(得分:1)
从书籍“Java Generics and Collections”:
铸铁保证:通用编译添加的隐式转换永远不会失败
答案 4 :(得分:0)
铸铁保证是您完全可信赖/依赖的东西。对您的问题感到好奇的是,Java泛型不提供类型安全的铸铁保证。只是一个有条件的。
因此,您需要指明您在哪里找到表达式来理解上下文。
答案 5 :(得分:0)
- Generics
可以在variables
,classes
,methods
上实施,但它是专为类型安全而设计的 collections
。
- 如果未引入Generics
,则任何特定类型的对象都会进入集合内部,并以对象类型形式出现。
<强>例如强>
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
,因为此编译问题是在编译时自行处理的。