注意:它可能是以某种方式写在JLS中的,但我在任何地方都找不到合适的描述。
表达式new string[0].getClass()
直接编译为指令以创建新数组,然后调用getClass()
的方法。相反,类文本string[].class
被编译为一个LDC
指令,如“类文本如何编译为Java字节码?”中所述。
您可以通过运行以下程序来验证这一点
package jvm;
import javax.tools.ToolProvider;
public class GetArrayClass {
public static Class<?> viaGetClass() {
return new String[0].getClass();
}
public static Class<?> viaClassLiteral() {
return String[].class;
}
public static void main(String[] args) {
decompile();
}
private static void decompile() {
Object args = new String[]{"-c", GetArrayClass.class.getName()};
try {
ToolProvider.getSystemJavaCompiler().getClass().getClassLoader()
.loadClass("com.sun.tools.javap.Main")
.getMethod("main", String[].class).invoke(null, args);
} catch(ReflectiveOperationException ex) {
throw new IllegalStateException(ex);
}
}
private GetArrayClass(){}
}
Ideone演示
public static java.lang.Class<?> viaGetClass();
Code:
0: iconst_0
1: anewarray #1 // class java/lang/String
4: invokevirtual #2 // Method java/lang/Object.getClass:()Ljava/lang/Class;
7: areturn
public static java.lang.Class<?> viaClassLiteral();
Code:
0: ldc #3 // class "[Ljava/lang/String;"
2: areturn
问题内容: 我正在尝试创建一个泛型类型的数组。我收到错误消息: 我很困惑。任何线索为什么会这样。 问题答案: 其背后的原因是,您不能创建通用或参数化类型的数组,而只能 创建可验证的 类型(即可以在运行时推断出的类型)。 尽管可以将此类数组类型 声明 为变量或方法参数。这有点不合逻辑,但这就是Java的样子。 Java泛型和集合在第6章中广泛讨论了此问题和相关问题。
我正在努力弄清楚是否可以在TypeScript中声明一个静态类型的函数数组。 例如,我可以这样做: 但是,如果我想让foo成为一个函数数组,它接受一个字符串而不返回任何内容,我该怎么做呢? 不起作用,因为TypeScript认为它是一个接受字符串并返回空数组的函数,而且它似乎不喜欢我试图将函数包装在括号中。 有什么想法吗? 答:感谢下面的穆罕默德,这里有一个在TypeScript游戏场中工作的示例
问题内容: 我正在处理阵列,需要一些帮助。我想创建一个数组,其中第一个字段是String类型,第二个字段是Integer类型。对于结果: 调出 问题答案: 数组只能具有单个类型。您可以创建一个新类,例如: 您可能还对使用地图感兴趣(在我看来,您好像正在尝试将字符串映射到ID)。 编辑:您还可以定义类型的对象数组,但这是我通常会避免的事情。
问题内容: 我最近开始学习JAVA泛型。一切都说得通,我现在有点理解。但是有一件事让我烦恼-您无法创建通用类型的数组。 我想实现诸如队列和堆栈之类的抽象数据类型,但是要使用某种通用类型作为存储在堆栈中的基础数据。我将如何解决?我确定我想念但那是什么? 提前致谢。 问题答案: 《有效的Java》,第5章,GENERICS,第25项:首选列表而不是数组 : 数组在两个重要方面不同于通用类型。首先,数组
数组是一组包含相同数据类型 T 的组合,并存储在连续的内存区中。数组使用中括号 [] 来创建, 另外它们的大小在编译期间就已确定,数组的类型标记为 [T; size](译注:T 为元素的类型,size 表示数组的大小)。 slice(中文有“切片”之意) 类型和数组类似,但 slice 类型的大小在编译期间是不确定的。相反, slice 是一个双字对象(two-word object),第一个字是
问题内容: 我在弄清楚以下RHS中期望使用什么类型参数时遇到问题 为什么副本不合法? 问题答案: 具体参数化类型的数组固有地被破坏。请记住,数组是协变的,数组类型检查是运行时操作。在运行时,所有泛型都已被擦除,因此Array Store检查无法从中分辨出来。 泛型的基本约定是:“我,编译器,保证如果编写的代码不生成警告,则在运行时永远不会得到类强制转换异常。” 编译器也不能向您保证,如果在数组中放