Old*_*eon 6 java netbeans compiler-warnings
我终于试图摆脱Java 7所产生的所有新编译器警告.我这两个人离开了,我无法理解.有没有办法摆脱它们而不压制它们?
构造一般类型的对象数组(我可以在数组中创建一个?):
static final int N = 10;
//warning: [unchecked] unchecked conversion
static final Set<Widget>[] queued = new ConcurrentSkipListSet[N];
//required: Set<Widget>[]
//found: ConcurrentSkipListSet[]
Run Code Online (Sandbox Code Playgroud)
通用varargs(似乎几乎发生在我接受泛型类型的varargs的地方):
class Foo<T> {
//warning: [unchecked] Possible heap pollution from parameterized vararg type T
public void add(T... entries) {
//where T is a type-variable:
//T extends Object declared in class Foo
Run Code Online (Sandbox Code Playgroud)
顺便说一句:我已经:
// Add many entries to the list.
public void add(List<T> entries) {
// ...
}
// Add a number of entries.
public void add(T... entries) {
// Make a list of them.
add(Arrays.<T>asList(entries));
}
Run Code Online (Sandbox Code Playgroud)
对于第一个:
static final Set<Widget>[] queued = new ConcurrentSkipListSet<>[N];
Run Code Online (Sandbox Code Playgroud)
在Java 7之前,它必须是:
static final Set<Widget>[] queued = new ConcurrentSkipListSet<Widget>[N];
Run Code Online (Sandbox Code Playgroud)
但是,您可能最好将此声明为ArrayList<Set<Widget>>
.通常,混合数组和泛型在Java中有点困难.
static final List<Set<Widget>> queued = new ArrayList<>();
// or new ArrayList<Set<Widget>>();
Run Code Online (Sandbox Code Playgroud)
关于第二个,请看这个帖子.虽然你可以压制消息,但它实际上警告了真正的危险.该线程的底线是,安全的做法是将您的方法签名(以及相应的调用)更改为:
class Foo<T> {
public void add(List<T> entries) {
. . .
Run Code Online (Sandbox Code Playgroud)
问题基本上与第一个问题相同:您不应该创建泛型数组.
通用数组创建:
static final ConcurrentSkipListSet<Widget>[] queued = newArray(N);
// note: declare the most specific type for private objects
@SafeVarargs
static <E> E[] newArray(int length, E... array)
{
return Arrays.copyOf(array, length);
}
Run Code Online (Sandbox Code Playgroud)
它是如何工作的 - 由于newArray
是一个 vararg 方法,E[] array
必须传入一个参数,因此方法体可以访问E[]
. 这在理论上是正确的,如果没有擦除,它将在运行时完全类型安全。通过擦除,我们只在运行时擦除了类型E[]
,这很好,我们也返回相同的擦除类型。
归档时间: |
|
查看次数: |
986 次 |
最近记录: |