当前位置: 首页 > 知识库问答 >
问题:

Java8数组构造函数引用是如何工作的?

龙成仁
2023-03-14
IntFunction<int[]> i;

使用Java8泛型,可以使用构造函数引用初始化该变量,如下所示:

i = int[]::new

Java编译器如何将其转换为字节码?

我知道对于其他类型,比如String::new,它可以使用一个invokedynamic指令,该指令指向字符串构造函数java/lang/String. (...) ,这只是一个具有特殊含义的方法。

共有1个答案

章鸿光
2023-03-14

通过反编译java字节码,您可以自己找到答案:

javap -c -v -p MyClass.class

编译器将数组构造函数引用foo[]::new到lambda(i->new foo[i]),然后继续使用任何其他lambda或方法引用。下面是这个合成lambda的分解字节码:

private static java.lang.Object lambda$MR$new$new$635084e0$1(int);
descriptor: (I)Ljava/lang/Object;
flags: ACC_PRIVATE, ACC_STATIC, ACC_SYNTHETIC
Code:
  stack=1, locals=1, args_size=1
     0: iload_0       
     1: anewarray     #6                  // class java/lang/String
     4: areturn       

(它的返回类型是Object,因为IntFunction中擦除的返回类型是Object。)

 类似资料:
  • 问题内容: 假设我们有一个类型为变量的变量,它返回一个整数数组: 使用Java 8泛型,可以使用如下构造函数引用来初始化此变量: Java编译器如何将其转换为字节码? 我知道对于其他类型,例如,它可以使用指向String构造函数的指令,这只是一种具有特殊含义的方法。 看到有构造数组的特殊说明,这对数组如何工作? 问题答案: 您可以通过反编译Java字节码来发现自己: 编译器对数组lambda()进

  • 我注意到在Dart中可以创建一个const构造函数。在文档中,它说< code>const一词用于表示编译时常数。 我想知道当我使用构造函数创建对象时会发生什么。这是否像一个不可变对象,它总是相同的并且在编译时可用?构造函数的概念实际上是如何工作的?const构造函数与常规构造函数有何不同?

  • 本文向大家介绍使用Java8中的方法引用来引用构造函数,包括了使用Java8中的方法引用来引用构造函数的使用技巧和注意事项,需要的朋友参考一下 Java中的Lambda表达式使您可以将功能作为参数传递给方法。您也可以使用lambda表达式调用现有方法。 方法引用是简单,易于阅读的lambda表达式,可通过lambda表达式来调用/引用以及现有方法的名称。除了实例和静态方法,您还可以使用new关键字

  • 在Dart中,工厂构造函数需要编码器提供更多逻辑,但与常量构造函数没有太大区别,只是它们允许“非最终”实例变量。 与const Constructor相比,它们有哪些优点? 谢谢大家。 编辑 下面是关于Seth Ladd博客“Dart-试图理解“工厂”构造函数的价值”中工厂构造函数的用法。 恕我直言,使用通用构造函数,可以通过细微的差异实现相同的效果,但相当简单。 如上所示,尽管这两个实例 所以,

  • 在以下示例中,我尝试将引用方法与表达式一起使用: 输出 但是我在方法中得到的只是一个包含空元素的数组,表达式难道不应该创建一个具有指定大小的数组,并为每个元素调用类的构造,就像在方法中使用表达式时发生的那样吗?

  • 问题内容: 有人可以澄清Javascript中的构造函数和工厂函数之间的区别。 何时使用一个代替另一个? 问题答案: 基本区别在于,构造函数与关键字一起使用(这会使JavaScript自动创建一个新对象,在该函数内将该对象设置为该对象,然后返回该对象): 工厂函数的调用类似于“常规”函数: 但是要使其成为“工厂”,就需要返回某个对象的新实例:如果它仅返回布尔值或其他内容,则不会将其称为“工厂”函数