3

另一个我如何在没有警告问题的情况下执行 toArray(),但它与此处发布的大多数问题不同。

如何重写方法实现(不更改方法签名)以使其在没有警告的情况下编译?

这里明显的困难是 T 的类信息在运行时不可用。然而,返回类型在运行时也是一个被擦除的类型,所以没有理由不能这样做。那么,如果想强制执行编译时类型安全,我该怎么做呢?

谢谢

<T> GenericClass<T>[] toGenericArray(List<GenericClass<T>> list) {
    return list.toArray(new GenericClass[0]);
}
4

2 回答 2

2

你不能。因为数组是协变的,所以对于持有参数化类型的数组来说,编译时安全是不可能的。(除非您使用合法的 < ? >。)

这将永远是合法的:

GenericClass<String>[] array = new GenericClass[1];
Object[] brokenArray = array;
brokenArray[0] = new GenericClass<Integer>();
String value = array[0].getGenericValue(); //kaboom

编译器无法保护您免受此影响,因此它会强制您确认/禁止出现警告。

于 2010-12-13T23:28:32.263 回答
1

您可以添加@SuppressWarnings("unchecked")注释。这不会更改方法签名,并允许您在不生成警告的情况下执行“不安全”的操作。您的代码是真正安全的,因此可以取消警告。请注意,根据@Affe 的回答,您返回后可能会发生坏事,但您当然可以正确实施您的方法。

Java Collections 框架在内部完成了这种工作,因此它不仅仅是一个 hack。好吧,这一个 hack,但它是一个 OK hack。好吧,这不是那么好,但它有效。有点。

于 2010-12-13T23:33:16.617 回答