无法将通用数组直接分配给局部变量

时间:2018-06-24 16:15:33

标签: java generics

考虑以下代码:

final public class Array<T> implements Iterable<T> {
    private T[] array;
    private int l;
    private int h;
    public Array(int L, int H) {
        @SuppressWarnings("unchecked")
        this.array =  (T[]) (new Object[H- L+1]);
        this.l = L;
        this.h = H;
    }
}

它无法在我的计算机上编译,并出现以下错误:

Array.java:21: error: illegal start of type
        this.array =  (T[]) (new Object[H- L+1]);
        ^
Array.java:21: error: ';' expected
        this.array =  (T[]) (new Object[H- L+1]);
            ^
2 errors

VSCode中可用的语法检查器/语法甚至抱怨以下内容:

[Java] Syntax error, insert "enum Identifier" to complete EnumHeaderName
[Java] Syntax error, insert "EnumBody" to complete BlockStatements

@SupressWarnings语句之后。

但是,当我将构造函数更改为此:

final public class Array<T> implements Iterable<T> {
    private T[] array;
    private int l;
    private int h;
    public Array(int L, int H) {
        @SuppressWarnings("unchecked")
        final a = (T[]) (new Object[H- L+1]);
        this.array =  a;
        this.l = L;
        this.h = H;
    }
}

它按预期工作。


我的问题是:

我不能将通用数组直接分配给我的本地字段是什么? 这是编译器错误吗?

我在最新的Arch Linux安装上使用以下Java版本。

$ java -showversion
openjdk version "1.8.0_172"
OpenJDK Runtime Environment (build 1.8.0_172-b11)
OpenJDK 64-Bit Server VM (build 25.172-b11, mixed mode)

1 个答案:

答案 0 :(得分:3)

语句@SuppressWarnings("unchecked")放错了位置。像这样将其移到构造函数上方:

@SuppressWarnings("unchecked")
public Array(int L, int H) {
    this.array =  (T[]) (new Object[H- L+1]);
    this.l = L;
    this.h = H;
}