为什么我不能直接将数组输入到print语句中?

时间:2017-11-09 22:34:33

标签: java arrays compiler-errors

我有以下代码。

import java.util.Arrays;

public class Practice {  

    public static void main(String[] args) {
        System.out.println(checkEquality({1,2,3},{1,2,3}));
    }

    public static boolean checkEquality(int[] a, int[] b) {
        return  Arrays.equals(a,b);
    }
}

我正在尝试编写一个方法来检查int类型的两个数组之间的相等性。编写的代码没有编译,这给了我第11行(具有print语句的那个​​)的非法表达式错误启动。但是,如果我首先在main方法中定义两个数组

int[] a= {1,2,3};
int[] b= {1,2,3};

然后更改

System.out.println(checkEquality({1,2,3},{1,2,3}));

System.out.println(checkEquality(a,b));

代码编译并按原样运行,给我真实。

我的问题:为什么我不能直接在print语句中输入我要检查相等性的两个数组?这适用于所有其他没有数组的方法,ex表达式涉及整数和字符串。 我在这里做错了还是一般不可能?如果是这样,为什么?

2 个答案:

答案 0 :(得分:1)

你可以,只是你的整数数组构造函数不正确。尝试:

System.out.println(checkEquality(new int[]{1,2,3},new int[]{1,2,3}));

答案 1 :(得分:1)

可以通过以下方式初始化数组......

int[] a = new int[10];
int[] a = new int[]{1,2,3,4,5,6,7,8,9,0}
int[] a = {1,2,3,4,5,6,7,8,9,0}; // anonymous array

最后一个被称为匿名数组,因为它不会让您知道它所具有的元素的大小和类型。因此,匿名数组不能直接作为方法参数传递。前两种方法可用于直接将数组作为方法参数传递。

这是Java规范必须说的

https://docs.oracle.com/javase/specs/jls/se7/html/jls-10.html#jls-10.6

  

可以在声明(第8.3节,第9.3节,第14.4节)中指定数组初始值设定项,或者作为数组创建表达式(第15.10节)的一部分,以创建数组并提供一些初始值。

     

数组初始值设定项是以逗号分隔的表达式列表编写的,用大括号{和}括起来。

     

尾随逗号可能出现在数组初始值设定项中的最后一个表达式之后,将被忽略。

     

每个变量初始值设定项必须与数组的组件类型进行赋值兼容(第5.2节),否则会发生编译时错误。

     

如果要初始化的数组的组件类型不可恢复(第4.7节),则为编译时错误。

以下是可兑换的含义https://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.7

  

由于在编译期间会删除某些类型信息,因此并非所有类型在运行时都可用。 在运行时完全可用的类型称为可再生类型。

因此,对于您的情况,您可以采用以下两种方法......

System.out.println(checkEquality(new int[]{1,2,3},new int[]{1,2,3}));

int[] a = {1,2,3};
int[] b = {1,2,3};
System.out.println(checkEquality(a,b));