首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java 11 - Java语言规范中类型转换的新案例

Java 11 - Java语言规范中类型转换的新案例
EN

Stack Overflow用户
提问于 2020-08-30 22:53:12
回答 1查看 354关注 0票数 15

Java 11的JLS第5.2节包含一些Java8的JLS没有的新类型转换用例,请参阅列表中的第4项和第5项:

指派上下文允许使用以下内容之一:

  1. 身份转换
  2. 不断扩大的本原转换
  3. 一种扩大的参考转换
  4. 扩大引用转换,然后取消装箱转换
  5. 扩大引用转换,然后取消装箱转换,然后是扩大原语转换
  6. 拳击转换
  7. 装箱转换,后面是扩大引用转换
  8. 取消装箱转换
  9. 取消装箱的转换,然后是扩大的原语转换

我不理解列表中的case 4case 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代码进行交互)?

EN

回答 1

Stack Overflow用户

发布于 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的一个示例

代码语言:javascript
复制
< 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…类型的一种实际用法。

代码语言:javascript
复制
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文档中也有这个示例

代码语言:javascript
复制
…
  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本身的就不足为奇了。

这是。

不过,我敢打赌,那些对规范的解禁/扩宽相关的更改与瓦尔哈拉有着很大的关系。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63662871

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档