在以下示例中,我尝试将引用方法与表达式arrayType[]::new
一起使用:
public class Main
{
public static void main(String[] args)
{
test1(3,A[]::new);
test2(x -> new A[] { new A(), new A(), new A() });
test3(A::new);
}
static void test1(int size, IntFunction<A[]> s)
{
System.out.println(Arrays.toString(s.apply(size)));
}
static void test2(IntFunction<A[]> s)
{
System.out.println(Arrays.toString(s.apply(3)));
}
static void test3(Supplier<A> s)
{
System.out.println(s.get());
}
}
class A
{
static int count = 0;
int value = 0;
A()
{
value = count++;
}
public String toString()
{
return Integer.toString(value);
}
}
输出
[null, null, null]
[0, 1, 2]
3
但是我在方法Test1
中得到的只是一个包含空元素的数组,表达式ArrayType[]::New
难道不应该创建一个具有指定大小的数组,并为每个元素调用类A
的构造,就像在方法Test3
中使用表达式Type::New
时发生的那样吗?
arrayType[]::new
是数组构造函数的方法引用。创建数组实例时,元素将初始化为数组类型的默认值,引用类型的默认值为NULL。
正如new arraytype[3]
生成由3个null
引用组成的数组一样,当s
是数组构造函数的方法引用(即arraytype[]::new
)时,调用s.apply(3)
也会生成由3个null
引用组成的数组。
本文向大家介绍使用Java8中的方法引用来引用构造函数,包括了使用Java8中的方法引用来引用构造函数的使用技巧和注意事项,需要的朋友参考一下 Java中的Lambda表达式使您可以将功能作为参数传递给方法。您也可以使用lambda表达式调用现有方法。 方法引用是简单,易于阅读的lambda表达式,可通过lambda表达式来调用/引用以及现有方法的名称。除了实例和静态方法,您还可以使用new关键字
鉴于 IntelliJ IDEA 2016.1.1报告“可以替换为方法引用”。 我知道无参数构造函数的< code>Foo::new语法,但是不知道如何将< code>foo作为参数传入。我肯定漏掉了什么。
在创建接受多个一维数组的构造函数时遇到困难: 我一直得到多个错误--标记的语法错误,错位的构造--类型不匹配:无法从字符串[]转换为关系--标记“}”的语法错误,删除此标记--标记“)”的语法错误,}预期 我需要能够单独使用每个数组与关系类。
使用Java8泛型,可以使用构造函数引用初始化该变量,如下所示: Java编译器如何将其转换为字节码? 我知道对于其他类型,比如,它可以使用一个指令,该指令指向字符串构造函数,这只是一个具有特殊含义的方法。
问题内容: 假设我们有一个类型为变量的变量,它返回一个整数数组: 使用Java 8泛型,可以使用如下构造函数引用来初始化此变量: Java编译器如何将其转换为字节码? 我知道对于其他类型,例如,它可以使用指向String构造函数的指令,这只是一种具有特殊含义的方法。 看到有构造数组的特殊说明,这对数组如何工作? 问题答案: 您可以通过反编译Java字节码来发现自己: 编译器对数组lambda()进
问题内容: 如果我有一个像这样的构造函数: 然后,我如何在与构造函数相同的类中的方法中使用变量c和d,因为尝试仅在方法中使用变量名似乎不起作用? 问题答案: 实际上,您的代码将无法编译- 无效。 我认为您的意思是:- 。 然后我如何在与构造函数相同的类中的方法中使用变量c和d 您不能这样做,因为您已将它们声明为局部变量,其范围在构造函数结束执行时终止。 您应该将它们声明为实例变量。