我在没有任何警告问题的情况下如何做的另一个我如何做,但这与这里发布的大多数人不同。

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

这里的明显困难是,在运行时不可用的类信息。但是,返回类型在运行时也是删除的类型,因此没有真正的理由无法做到这一点。那么,如果要执行编译时类型安全,该怎么办?

谢谢

<T> GenericClass<T>[] toGenericArray(List<GenericClass<T>> list) {
    return list.toArray(new GenericClass[0]);
}
有帮助吗?

解决方案

你不能。由于阵列是协变量的,因此不可能拥有具有参数化类型的数组的编译时间安全性。 (除非您使用<?>哪个是合法的。)

这将永远是合法的:

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

编译器无法保护您免受此影响,因此它迫使您承认/压制有警告。

其他提示

您可以添加一个 @SuppressWarnings("unchecked") 注解。这不会改变方法签名,并允许您在不发出警告的情况下执行“不安全”的事情。您的代码确实是安全的,因此可以抑制警告。请注意,根据 @affe的答案,返回后可能会发生坏事,但是您肯定可以正确地实现您的方法。

Java Collections Framework在内部执行此类功能,因此不仅仅是黑客。好吧,它 一个黑客,但这是一个很好的黑客。好吧,没关系,但是有效。有点。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top