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

使用数组构造函数[duplicate]的引用方法

空枫涟
2023-03-14

在以下示例中,我尝试将引用方法与表达式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时发生的那样吗?

共有1个答案

董联
2023-03-14

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 您不能这样做,因为您已将它们声明为局部变量,其范围在构造函数结束执行时终止。 您应该将它们声明为实例变量。