【发布时间】:2012-11-29 13:35:48
【问题描述】:
为什么代码替代(1) 编译时没有警告,而代码替代(2) 会产生“未经检查的强制转换”警告?
两者通用:
class Foo<T> {
Foo( T [] arg ) {
}
}
备选方案(1):
class Bar<T> extends Foo<T> {
protected static final Object [] EMPTY_ARRAY = {};
@SuppressWarnings("unchecked")
Bar() {
super( (T []) EMPTY_ARRAY );
}
}
备选方案(2):
class Bar<T> extends Foo<T> {
@SuppressWarnings("unchecked")
Bar() {
super( (T []) EMPTY_ARRAY );
}
protected static final Object [] EMPTY_ARRAY = {};
}
替代(2)产生:
javac -Xlint:unchecked Foo.java Bar.java
Bar.java:4: warning: [unchecked] unchecked cast
super( (T []) EMPTY_ARRAY );
^
required: T[]
found: Object[]
where T is a type-variable:
T extends Object declared in class Bar
1 warning
这是:
java version "1.7.0_07"
Java(TM) SE Runtime Environment (build 1.7.0_07-b10)
Java HotSpot(TM) 64-Bit Server VM (build 23.3-b01, mixed mode)
【问题讨论】:
-
我可能是盲人,但区别在哪里?这两个代码示例在我看来都是一样的,只是顺序不同。
-
我想他想知道为什么一个替代方案会产生警告而另一个不会?事实上,它们似乎是等价的。
-
Pro-SO 提示 1:与 cmets 中的人交谈时,使用
@符号。这会在该人的收件箱中放置一条通知,以便他们看到您的评论。 Pro-SO 提示 2:您可以在@中键入他们姓名后的前几个字母,然后按 Tab 自动补全他们的姓名。 -
@Natix:很高兴我不是唯一一个被迷惑的人。 JDK 7 中似乎已经添加了它,突然出现了 6 中没有的警告。
-
我确实接受了这个建议并向 Oracle 提交了一个错误。恐怕还有其他一些地方 JDK 1.7 也忽略了@SuppressWarnings("unchecked"),但我没有隔离它们。这一切都曾经在 1.6 中工作......
标签: java generics java-7 suppress-warnings unchecked