考虑以下代码:
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)
答案 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;
}