当前位置: 首页 > 面试题库 >

本地类型推断与实例

夏建木
2023-03-14
问题内容

我尝试扫描有关本地类型推断的JEP-286。我看到这仅适用于局部变量-
了解。因此这确实有效:

public class TestClass {
    public static void main(String [] args){
        var list = new ArrayList<>();
        list.add("1");
        System.out.println(list.get(0)); // 1
    }  
}

我确实看到,另一方面,它无法编译:

public class TestClass {
    public var list = new ArrayList<>();
    public static void main(String [] args){

    }
}

很明显,事实并非如此,因为JEP是这样说的。现在我的问题是:

对于宣布失败的 公共/受保护
成员var,至少是IMO,这是完全合理的。但是,为什么即使编译也不编译private呢?我只能假设您仍然可以通过反射保留该变量(而我无法获得这样的局部字段)…而且获取该变量可能需要强制转换,很可能是非常混乱的强制转换。


问题答案:

禁止对字段和方法返回值进行类型推断的动机是,API应该稳定;字段访问和方法调用在运行时通过描述符链接在一起,因此,如果对实现的更改导致推断的类型发生更改(模删除),则导致对推断的类型进行细微更改的事情可能导致现有的已编译客户端以可怕的方式中断。这对于实现而不是对API来说是明智的指导原则。

合理地问“那么,私有字段和方法呢?”
确实,我们很可能选择这样做。像所有设计决策一样,这是一个权衡。它可以使推理在更多的地方使用,以换取用户模型的更多复杂性。(我不太关心规范或编译器的复杂性;这是我们的问题。)比添加诸如“但是”字段之类的各种周转注意事项,更容易推理“推断局部变量为,字段和方法为否”如果方法是私有的,则方法也可以。”
在我们所做的事情上划清界限还意味着,将字段或方法从私有更改为非私有的兼容性后果不会产生偶然的推理交互。

因此,简短的答案是,以这种方式进行操作会使语言更简单,而又不会大大降低功能的实用性。



 类似资料:
  • 我试图扫描JEP-286关于局部类型推断的信息。我看到这只适用于局部变量-理解。因此,这确实有效: 另一方面,我确实看到这并不能编译: 很明显,事实并非如此,因为JEP是这么说的。现在我的问题是: 声明为的公共/受保护成员失败是完全合理的,至少IMO是如此。但是,为什么即使它是,它也不能编译呢?我只能假设您仍然可以通过反射来获取该变量(我无法获取这样的局部字段)……而获取该变量需要进行转换,很可能

  • 从JEP 286中,我们可以在JDK 10(18.3)中利用本地类型推断()。JEP声明将进行以下编译,这是预期的: 谢谢!

  • 主要内容:1 Java8 类型推断的介绍,2 Java8 类型推断的案例1,3 Java8 类型推断的案例21 Java8 类型推断的介绍 类型推断是Java的一项功能,它使编译器可以查看每个方法调用和相应的声明以确定参数的类型。 Java在Java 8中提供了类型推断的改进版本。 1.1 Java8以前 在下面的声明中,我们在一侧提到了arraylist的类型。这种方法是在Java 7中引入的。在这里,您可以将第二面留为<>,并且编译器将通过引用变量的类型来推断其类型。 1.2 Java8以后

  • TypeScript 类型检查机制包含三个部分: 类型推断 类型保护 类型兼容性 本节介绍其中的类型推断,类型推断主要用于那些没有明确指出类型的地方帮助确定和提供类型,这是 TypeScript 的一种能力。 类型推断是有方向的,要注意区分从左向右和从右向左两种推断的不同应用。 1. 慕课解释 类型推断的含义是不需要指定变量类型或函数的返回值类型,TypeScript 可以根据一些简单的规则推断其

  • 01 模板类型推断机制 auto 推断的基础是模板类型推断机制,但部分特殊情况下,模板推断机制不适用于 auto 模板的形式可以看成如下伪代码 template<typename T> void f(ParamType x); // ParamType 即 x 的类型 调用可看成 f(expr); 编译期间,编译器用 expr 推断 T 和 ParamType,实际上两者通常不一致,比如 te