标签: jls

\ uXXXX,\ uuXXXX和\ uuuXXXX之间的区别

以下行来自JLS§3.3:

如果符合条件的\后跟u 或者多个u,并且最后一个u后面没有四个十六进制数字,则会发生编译时错误.

所以这意味着以下几行将产生相同的结果:

System.out.println("\u0065");   // prints "e"
System.out.println("\uu0065");  // prints "e"
System.out.println("\uuu0065"); // prints "e"
Run Code Online (Sandbox Code Playgroud)

使用单一的u\uXXXX本质上是做一样的使用uu\uuXXXX.我的问题是,为什么我们需要这种设计?

java jls

1
推荐指数
2
解决办法
778
查看次数

java中模式变量的范围是如何解析的?

我正在研究java中的模式变量。在阅读JLS时,它提到了有关何时引入模式变量的几个条件。它提到——

该分析依赖于技术术语“introduced by”,其形式如下:

  • 当 true 时,模式变量表达式引入
  • 当 false 时,模式变量表达式引入
  • 模式变量语句引入

在 6.3.1 中提到了表达式中模式变量的范围,其中指出何时为&&||!?:等引入模式变量。

但我觉得解释很混乱,谁能详细说明一下&&,,||!

模式变量的示例 -

Object o = "a";

if(o instanceof String s) {
    System.out.println(s); 
}
Run Code Online (Sandbox Code Playgroud)

我困惑的地方——

class foo {
    String s, n, p, m;

    void method() {
        Object o = "s";
        if (!(o instanceof Integer s) && o instanceof Integer n) {
            System.out.println(s + " " …
Run Code Online (Sandbox Code Playgroud)

java pattern-matching jls java-14

1
推荐指数
1
解决办法
970
查看次数

我什么时候可以使用"=="运算符?

我从jls找到了引用:

等于运算符可用于将两个可转换的操作数(第5.1.8节)与数字类型,或两个类型为boolean或Boolean的操作数,或两个操作数(分别为引用类型或null类型)进行比较.所有其他情况都会导致编译时错误.

但是这段代码

   String str= "";
   Number num = 1;
   System.out.println(str == num);
Run Code Online (Sandbox Code Playgroud)

每个操作数都是参考!

说它是不兼容的类型.

jls在哪里说这些类型应该兼容?

java equality reference jls

0
推荐指数
1
解决办法
76
查看次数

为什么abstract不适用于接口隐式方法?

在阅读JLS规范接口时,我遇到以下短语:

如果接口没有直接的超接口,则接口隐式声明一个公共抽象成员方法m,其中包含签名s,返回类型r和throws子句t,对应于具有签名s的每个公共实例方法m,返回类型r和throws子句t在Object中声明,除非接口显式声明具有相同签名,相同返回类型和兼容throws子句的方法.

所以我的问题是当我们实现一个接口时为什么我们不被强制覆盖在Object类中声明的隐式方法,即使它们在接口中被隐式定义为抽象.希望我能正确对待自己.

谢谢.

java interface abstract jls

0
推荐指数
1
解决办法
80
查看次数

为什么填充包含<?类型元素的集合时的行为差异?延伸T>?

在下面的代码片段中,它给出了第2行的编译错误,但它不在第3行.

List<? extends Object> list1 = new ArrayList<>(); // line 1
list1.add("123"); // line 2

List<? extends Object> list2 = Arrays.asList("123", new Integer(12)); // line 3
Run Code Online (Sandbox Code Playgroud)

如果语言设计者决定不允许将元素添加到元素类型的集合中,<? extends T>那么它也应该适用于第3行.

造成这种差异的原因是什么?

请澄清.

java generics jls

0
推荐指数
1
解决办法
40
查看次数

当涉及类型参数时,为什么 Java 无法找出一些明显的非法强制转换?

考虑以下示例:

public class Example {
    public static <T> void f(T obj) {
        Integer i = (Integer) obj; // runtime error
    }
    public static void main(String[] args) {
        f("hello");
    }
}
Run Code Online (Sandbox Code Playgroud)

有什么理由让 Java 无法确定第 3 行中的强制转换在编译时是非法的吗?当然,由于类型擦除,运行时函数的签名将是f(Object obj),但在我看来,在编译时它有足够的信息来捕获错误。

将此与案例进行比较:

List<String> ls = new ArrayList<>();
ls.add(42); // compile-time error
ls.add("foo");
Integer i = ls.get(0); // compile-time error
Run Code Online (Sandbox Code Playgroud)

其中涉及类型参数但在编译时成功检测到错误。

如果答案是“编译器不够聪明”,那么有什么理由(为了向后兼容?)为什么不能让它变得更聪明?

java generics casting jls

0
推荐指数
1
解决办法
57
查看次数