以下行来自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时,它提到了有关何时引入模式变量的几个条件。它提到——
该分析依赖于技术术语“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) 我从jls找到了引用:
等于运算符可用于将两个可转换的操作数(第5.1.8节)与数字类型,或两个类型为boolean或Boolean的操作数,或两个操作数(分别为引用类型或null类型)进行比较.所有其他情况都会导致编译时错误.
但是这段代码
String str= "";
Number num = 1;
System.out.println(str == num);
Run Code Online (Sandbox Code Playgroud)
每个操作数都是参考!
说它是不兼容的类型.
jls在哪里说这些类型应该兼容?
在阅读JLS规范接口时,我遇到以下短语:
如果接口没有直接的超接口,则接口隐式声明一个公共抽象成员方法m,其中包含签名s,返回类型r和throws子句t,对应于具有签名s的每个公共实例方法m,返回类型r和throws子句t在Object中声明,除非接口显式声明具有相同签名,相同返回类型和兼容throws子句的方法.
所以我的问题是当我们实现一个接口时为什么我们不被强制覆盖在Object类中声明的隐式方法,即使它们在接口中被隐式定义为抽象.希望我能正确对待自己.
谢谢.
在下面的代码片段中,它给出了第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行.
造成这种差异的原因是什么?
请澄清.
考虑以下示例:
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)
其中涉及类型参数但在编译时成功检测到错误。
如果答案是“编译器不够聪明”,那么有什么理由(为了向后兼容?)为什么不能让它变得更聪明?