泛型和创建可比较对象(Java)
被阅读?是创建新的可比较对象还是实现可比较接口的新对象泛型和创建可比较对象(Java),java,generics,comparable,Java,Generics,Comparable,被阅读?是创建新的可比较对象还是实现可比较接口的新对象 newcomparable[N]创建一个包含N元素的数组,这些元素可以容纳Comparable或Comparable的任何子类型。没有创建任何可比较的,只创建一个数组 对于强制转换,通常如果您执行类似于(String[])new Comparable[N]的操作,您将得到一个ClassCastException,因为它不是有效的强制转换。但是,对T[]的强制转换未选中,这意味着它不会发生在强制转换表达式所在的特定点上。相反,在您的Array
newcomparable[N]
创建一个包含N
元素的数组,这些元素可以容纳Comparable
或Comparable
的任何子类型。没有创建任何可比较的,只创建一个数组
对于强制转换,通常如果您执行类似于(String[])new Comparable[N]
的操作,您将得到一个ClassCastException
,因为它不是有效的强制转换。但是,对T[]
的强制转换未选中,这意味着它不会发生在强制转换表达式所在的特定点上。相反,在您的ArrayHeap
类之外的其他地方,有一些代码如下:
heap = (T[]) new Comparable[capacity];
ArrayHeap<String> h = ...;
String s = h.get(...);
因此,我们可以说这有点像(T[])
演员阵容被移动了
然而,问题是,当你做
(t[])新的可比[N]
时,你实际上并没有得到一个t[]
。您只是在某种程度上欺骗编译器,以便在ArrayHeap
类的主体中提供更好的静态类型检查。如果您试图将Comparable[]
作为T[]
返回到外部世界,您将得到一个异常。new Comparable[N]
创建一个包含N
元素的数组,该数组可以容纳Comparable
或Comparable
的任何子类型。没有创建任何可比较的,只创建一个数组
对于强制转换,通常如果您执行类似于(String[])new Comparable[N]
的操作,您将得到一个ClassCastException
,因为它不是有效的强制转换。但是,对T[]
的强制转换未选中,这意味着它不会发生在强制转换表达式所在的特定点上。相反,在您的ArrayHeap
类之外的其他地方,有一些代码如下:
heap = (T[]) new Comparable[capacity];
ArrayHeap<String> h = ...;
String s = h.get(...);
因此,我们可以说这有点像(T[])
演员阵容被移动了
然而,问题是,当你做
(t[])新的可比[N]
时,你实际上并没有得到一个t[]
。您只是在某种程度上欺骗编译器,以便在ArrayHeap
类的主体中提供更好的静态类型检查。如果您试图将Comparable[]
作为T[]
返回到外部世界,您将得到一个异常。它正在创建一个可以容纳Comparable
对象的数组。重要的一点是,数组只允许容纳可比较的对象<代码>新对象[容量]
将允许容纳任何内容
您真正想要的是一个T[]
——这意味着数组仅限于容纳堆应该使用的特定类型T
——但这是不可能的,因为Java的泛型是如何工作的()。由于要实现Comparable
,需要T
,因此下一个最好的方法是一个Comparable
数组
不过,这仍然很尴尬,编译器会警告您将Comparable
用作原始类型。最好将堆
定义为一个列表
,并用新的ArrayList(capacity)
初始化它它正在创建一个可以容纳可比较的
对象的数组。重要的一点是,数组只允许容纳可比较的对象<代码>新对象[容量]
将允许容纳任何内容
您真正想要的是一个T[]
——这意味着数组仅限于容纳堆应该使用的特定类型T
——但这是不可能的,因为Java的泛型是如何工作的()。由于要实现Comparable
,需要T
,因此下一个最好的方法是一个Comparable
数组
不过,这仍然很尴尬,编译器会警告您将Comparable
用作原始类型。最好将堆定义为列表
,并用新的ArrayList(capacity)
初始化它