Java 11的JLS第5.2节包含一些Java8的JLS没有的新类型转换用例,请参阅列表中的第4项和第5项:
指派上下文允许使用以下内容之一:
我不理解列表中的case 4和case 5。有人能给我举一些例子来解释一下吗?如果可能的话,也请解释它的实际用法。
更新:
作为@Naman 评论,下面是修改JLS-JLS-9之后生效的JLS - JDK-8166326 : 5.2:在取消装箱之前允许扩展的建议。它在报告中提到:
这种行为对于与capture的互操作性特别重要::,各种现有的程序,期望能够将
List<? extends Integer>的元素当作ints对待。 List<?扩展Integer> li = null;int = li.get(0);
这可能意味着JLS的这一更改确实具有实际的必要性。但我还是不明白为什么<?扩展Integer>很重要。与捕获的互操作性意味着什么,为什么它很重要?这些现有的程序是什么样子的?它们是java代码(我知道其他一些语言也在JVM上工作,并且可能与Java代码进行交互)?
发布于 2020-09-18 17:56:31
TL;博士
“…拳击的问题在于它是临时的和昂贵的;为了解决这两个问题,已经进行了大量的工作“- https://cr.openjdk.java.net/%7Ebriangoetz/valhalla/sov/02-object-model.html#isnt-this-just-boxing-with-a-fancy-new-name。
这使我怀疑,您所指的规范的这些更改正在为计划中的“代码像类,工作像int”的L-World在上面的链接中讨论的功能做准备。
“…有人能用例子给我一些解释吗?…“
2016年bug报告中链接到的注释(https://bugs.java.com/bugdatabase/view_bug.do?bug_id=8030017)中的示例提供了列表中#4的最佳示例。基于这些,下面是列表中#5的一个示例
< I extends Integer > void soAns0( I intRef ) {
int intPrim;
long longPrim = /* (3) a widening primitive conversion */
intPrim = /* (2) an unboxing conversion */
intRef; /* (1) a widening reference */
}“…如果可能,也请解释它的实际用法…。“
https://www.wikiwand.com/en/Natural_number通常被称为“整数”。https://docs.oracle.com/javase/tutorial/java/generics/bounded.html展示了限制自然数仅为Integer…类型的一种实际用法。
public class NaturalNumber<T extends Integer> {
private T n;
public NaturalNumber(T n) { this.n = n; }
public boolean isEven() {
return n.intValue() % 2 == 0;
}
// …
}https://docs.oracle.com/en/java/javase/15/docs/api/java.desktop/javax/swing/RowFilter.html…的API文档中也有这个示例
…
public boolean include(Entry<? extends PersonModel, ? extends Integer> entry) {
…
Person person = personModel.getPerson(entry.getIdentifier());
…
}
…T extends Integer可能合适的另一个用例是,如果您想显式地禁止您的类与任何其他类型的Number 参数化,而则显式禁止将 Integers添加到该参数化类型中--方法是利用https://books.google.co.uk/books?id=VUSbAgAAQBAJ&lpg=PA22&dq=Naftalin%20Wadler%20%22Get%20and%20Put%20principle%22%20google%20books&pg=PA19#v=snippet&q=%22The%20Get%20and%20Put%20Principle%22&f=false。
假设您有一些代码,给定一些数字,将创建这个数目的对象。如果您想通过Long.MAX_VALUE次数的DOS尝试来阻止坏的参与者来压倒您的系统,那么包围<T extends Short>可能是限制在任何一个方法调用中创建的对象数量的一种方法。
“…这些现有的程序是什么样子的?它们是java代码吗?…“
在github上搜索T extends Integer可以找到https://github.com/search?l=Java&p=1&q=%22T+extends+Integer%22&type=Code。
“…与capture的互操作性意味着什么?…“
我推迟了对捕获转换为https://docs.oracle.com/javase/specs/jls/se15/html/jls-5.html#jls-5.1.10的明确解释。
“…为什么这很重要?…“
捕获转换很重要,因为它与类型推断的连接。
‹Integer <: α›在https://docs.oracle.com/javase/specs/jls/se15/html/jls-18.html#jls-18.1.2-100中或多或少是表示Integer extends Integer ( T extends Integer有效意思是什么)…的一种正式方式。
… 在
Arrays.asList(1, 2.0)__中,我们有约束公式‹1 → α›和‹2.0 → > α›__。通过简化,这些将成为约束公式‹int → α›和‹double → α›__,然后是‹Integer <: α›和‹Double <: α›__。 …
既然如此,JDK本身的就不足为奇了。
这是。
不过,我敢打赌,那些对规范的解禁/扩宽相关的更改与瓦尔哈拉有着很大的关系。
https://stackoverflow.com/questions/63662871
复制相似问题