【问题标题】:Java - Why declare an array as a type of Interface?Java - 为什么将数组声明为接口类型?
【发布时间】:2017-09-10 23:14:49
【问题描述】:

这是来自 Mark Weiss 教授在他的书Java 中的数据结构和算法分析

public class BinaryHeap<AnyType extends Comparable<? super AnyType>>{
    private void enlargeArray( int newSize ){
        AnyType [] old = array;
        array = (AnyType []) new Comparable[ newSize ];
        for( int i = 0; i < old.length; i++ )
        array[ i ] = old[ i ];        
    }
}

我想知道为什么我们要声明一个具有 Comparable 接口类型的数组,因为我们必须将 Comparable[] 转换为 AnyType[]?里面有什么设计理念吗?

【问题讨论】:

  • 因为不能创建 AnyType[] 类型的数组。
  • @user2357112 并没有那么错。编译器将生成一个未经检查的强制转换警告,但是当您必须将泛型类型的对象存储在数组中时,您真的无法做得更好。只要数组是私有的并且不暴露,就可以了。
  • @LewBloch 他们没有:-)
  • @JBNizet:是的,如果没有明确的 Class 对象,你就无法摆脱未经检查的演员表,但最好对元素执行未经检查的演员表(实际上预计会有您将它们转换为的类型)而不是数组(绝对不是您将其转换为的类型)。
  • @user2357112 虽然可以正常工作,但如果您尝试在数组中存储 AnyType 以外的内容,至少会导致编译器抱怨。如果您使用 Comparable[],情况就不会如此。顺便说一句,com.sun.jmx.remote.internal.ArrayQueue 类确实使用了它。

标签: java arrays


【解决方案1】:

设计“哲学”是你不能实例化一个类型参数的数组,所以你必须用一个合法的类型来实例化数组。该方法已知的唯一可用的合法类型是ObjectComparable 的数组,后者捕获有关该类型的更多信息。

允许向下转换为类型参数的数组,返回类型必须是那个,所以需要向下转换。

这是必然性的“哲学”。

【讨论】:

  • “您可以向下转换为类型参数的数组” - 只有在这些转换未经检查且 Java 没有所需信息的意义上,您才被“允许”阻止你。
  • 换句话说,您可以在程序编译和运行的意义上这样做。
【解决方案2】:

我认为 AnyType 是泛型的。在 Java 中,您不能创建泛型数组。作为一种解决方法,他实例化了一个 Comparables 数组(一个接口),然后将其类型转换为一个泛型数组。

如果您查看此“如何创建泛型数组”question,有人提出初始化对象数组,然后将类型转换为所需泛型数组。

【讨论】:

    猜你喜欢
    • 2017-05-28
    • 1970-01-01
    • 1970-01-01
    • 2010-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-09
    • 1970-01-01
    相关资源
    最近更新 更多