gpt4 book ai didi

java - 为什么我们不能在 Java 7+ 中打开类?

转载 作者:搜寻专家 更新时间:2023-10-31 08:05:29 25 4
gpt4 key购买 nike

在我看来,这样的 switch 语句很有意义,但它给出了一个编译错误:

public void m(Class c) {
switch (c) {
case SubClassOfC1.class : //do stuff; break;
case SubClassOfC2.class : //do stuff; break;
}
}

但是不支持类开启。这是什么原因?

我不是在尝试解决 instanceof 问题,它实际上是在类级别上执行一些操作,那里没有实例。

编译错误围绕 SubClassOfC1 和 SubClassOfC2:需要常量表达式。

最佳答案

因为我们只能打开Constant Expressions (§15.28)Enum constants (§8.9.1) .

From the JLS :

The type of the Expression must be char, byte, short, int, Character, Byte, Short, Integer, String, or an enum type (§8.9), or a compile-time error occurs.

要想象为什么会这样,请考虑在 Java 编译器尝试编译 switch 语句时发生的优化。

  • 它想绝对地、积极地保障平等
  • 它希望能够针对所有情况最大化性能(分支预测)
  • 它希望有一种有效、一致的方式将常量表达式转换为整数查找表(这就是为什么不支持 longfloatdouble,但支持 String)。<

请注意 Stringswitch 中得到支持报表是added only in Java 7 .这是因为编译器使用了 switch String 的幕后转换。至 switch int , 作为 detailed in this article .快速总结:

这段代码:

public class StringInSwitchCase {
public static void main(String[] args) {
String mode = args[0];
switch (mode) {
case "ACTIVE":
System.out.println("Application is running on Active mode");
break;
case "PASSIVE":
System.out.println("Application is running on Passive mode");
break;
case "SAFE":
System.out.println("Application is running on Safe mode");
}
}
}

变成这样的代码:

public class StringInSwitchCase {
public StringInSwitchCase() {}

public static void main(string args[]) {
String mode = args[0];
String s;
switch ((s = mode).hashCode()) {
default:
break;
case -74056953:
if (s.equals("PASSIVE")) {
System.out.println("Application is running on Passive mode");
}
break;
case 2537357:
if (s.equals("SAFE")) {
System.out.println("Application is running on Safe mode");
}
break;
case 1925346054:
if (s.equals("ACTIVE")) {
System.out.println("Application is running on Active mode");
}
break;
}
}
}

我们无法可靠地转Class对象以相同的方式转换为整数。类不会覆盖 hashCode,它使用 System.identityHashCode .

另请注意,同一类并不总是相同的Class , 如果它已经加载了不同的 ClassLoader .

关于java - 为什么我们不能在 Java 7+ 中打开类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31664071/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com