java - : T[] b = (T[]) new Object[n]; 的问题

标签 java generics

public class MergeSort
{
    /**
     * @param a Array to be sorted.
     * @param n Last element to be sorted.
     * @return void.
     */
    public static <T extends Comparable<T>> void sort(T[] a, int n)
    {
    }

    /**
     * @param inp Input Array.
     * @param out Output Array.
     * @param first First index.
     * @param mid Middle index.
     * @param last Last index.
     * @return void.
     */
    private static <T extends Comparable<T>>
            void merge(T[] inp, T[] out, int first, int mid, int last)
    {
    }
}

大家好,我需要一些帮助。

以上是我的教授给我们的大纲。我的问题是我想在 sort 方法中创建 a, T[] b 数组,这样当我将它们传递给 merge 方法时我可以重用这两个数组 'a' 和 'b' 。我每次调用它时都没有在合并中创建一个临时数组。我试过了

T[] b = (T[]) new Object[n];

该类将编译,但是当我使用整数数组从主类调用 sort 方法时,我得到:

java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.Comparable;

我能做什么? 任何帮助将不胜感激,如果我在任何地方错过了这个答案,我深表歉意。我一直在寻找一天的大部分时间。谢谢!

最佳答案

嗯,简短的回答是,在 Java 中,数组和泛型不能很好地协同工作。

如您所知,Java 泛型是使用类型删除实现的,这意味着在编译时类型可能是 <T extends Comparable<T>>[] ,在运行时类型被删除到其下限,在本例中为 Comparable[] (使用原始类型)。 T[] 的类型没有实际上被删除到Object[]除非那实际上是通用约束的下限。

这样做的结果是可以安全地说:

@SuppressWarnings("unchecked")
T[] b = (T[]) new Comparable<?>[n];

一切都应该如您所愿。

请注意,如果您尝试混合使用数组和泛型,实际上还有很多注意事项需要注意。例如,您可以通过使用泛型通配符(例如 <? extends T><? super T> )来实现泛型的协变和逆变,但 Java 中的数组本身实现协变(当您尝试使它们的类型不变量无效时,只抛出 ArrayStoreException)。因此,如果您能够从数组切换到泛型类型(例如 ArrayList<T> 可能会做您想要的),那么您会发现事情进展得更顺利。

您可能还会发现这些链接很有用:

关于java - : T[] b = (T[]) new Object[n]; 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5575976/

相关文章:

java - IList<T> 泛型 Java

generics - 使用 AutoMapper 实现 .ToViewModel()

java - 使用泛型参数列表的泛型方法声明

java - 为什么 Java 的 SimpleDateFormat 不是线程安全的?

java - 按下后退按钮时如何使 fragment 替换为特定 fragment

java - 为什么你需要知道抽象类的方法是否是抽象的

java - 如何停止单击相同的底部导航项?

c# - 如何将 List<String> 的内容分配给 RichTextBox?

generics - 完整、高效的 NumericLiteral 模块实现

java - ruby 中的条件和迭代器