【问题标题】:How would you refactor Arrays.copyOf() method in order to remove the @SuppressWarnings("unchecked") annotation?您将如何重构 Arrays.copyOf() 方法以删除 @SuppressWarnings("unchecked") 注释?
【发布时间】:2020-02-08 16:44:17
【问题描述】:

我正在查看 java 中的 Arrays 类,发现以下代码中使用了 @SuppressWarnings("unchecked") 注释。

    public static <T,U> T[] copyOf(U[] original, int newLength, Class<? extends T[]> newType) {
    @SuppressWarnings("unchecked")
    T[] copy = ((Object)newType == (Object)Object[].class)
        ? (T[]) new Object[newLength]
        : (T[]) Array.newInstance(newType.getComponentType(), newLength);
    System.arraycopy(original, 0, copy, 0,
                     Math.min(original.length, newLength));
    return copy;
}

您将如何重构以下代码以删除 @SuppressWarnings("unchecked") 注释?

【问题讨论】:

  • 你不能,because you can't create array of generic type in java。所以你必须进行类型转换。
  • @AdwaitKumar 但我们确实知道 T[] 的运行时类型。问题是没有带有适当签名的Array.newInstance
  • @TomHawtin-tackline 问题不是Array.newInstance(Class&lt;?&gt;, int)签名,而是它的返回类型。声明返回 Object 以适应元素类型是原始类型的情况,因此数组类型不是 Object[] 的子类型。
  • 是的,签名是错误的术语。我的意思是包括返回类型,componentType 的类型,它是 length 版本而不是 dimensions(它有另一个理由不返回 T[])。也许 签名 更好。

标签: java arrays generics


【解决方案1】:

这里。

public static <T,U> T[] copyOf(U[] original, int newLength, Class<? extends T[]> newType) {
T[] copy = newType.cast(
    Array.newInstance(newType.getComponentType(), newLength)
);

但它没有那么快,这对这种方法很重要。

【讨论】:

  • 为什么没那么快?
  • @IonKat 有对Class.cast 的调用,Object[] 没有特殊情况。
  • 抱歉,以我目前的知识水平,我不明白你的意思。
  • 但是Class.cast()的来源本身有一个@SuppressWarnings("unchecked"),所以在某种意义上这只是将注释从一个地方移动到另一个地方
  • @newacct 这将是一个实现细节。重要的是它是一个声音库方法。
猜你喜欢
  • 1970-01-01
  • 2013-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多