gpt4 book ai didi

java - 需要在 Java 中转换为通用类型

转载 作者:行者123 更新时间:2023-11-29 05:39:02 25 4
gpt4 key购买 nike

在使用链表(实际上是内部类 Node)实现优先级队列时,我编写了 insert()max()方法如下。它使用惰性方法保持项目无序,然后仅在 max()deleteMax() 调用发生时通过它们搜索最大元素。

public class LinkedListMaxPQ<Item extends Comparable<Item>>{
private int N;
private Node head;

public void insert(Item item) {
Node old = head;
head = new Node();
head.item = item;
head.next = old;
N++;
}

public Item max() {
Item maxitem = (Item) this.head.item;
for(Node t=head.next;t!=null;t=t.next){
if(gt(t.item,maxitem)){
maxitem = (Item) t.item;
}
}
return maxitem;
}
private boolean gt(Comparable x,Comparable y){
return x.compareTo(y) > 0;
}



private class Node<Item extends Comparable<Item>>{
Item item;
Node next;
}

}

我想知道为什么我需要在 Item maxitem = (Item) this.head.item 中进行转换?由于该类使用泛型 Item which extends Comparable 并且内部类也使用 Item extends Comparable ,所以有人会认为这样的转换是不必要的。

如果我省略类型转换

Item maxitem = this.head.item;

编译器会提示类型不匹配

Type mismatch: cannot convert from Comparable to Item

谁能解释为什么会这样?

最佳答案

因为 Java 正在处理 Item作为 Node 中的类型参数类声明(与 Item 中声明的 LinkedListMaxPQ<Item extends Comparable<Item>> 类型参数无关)。

这个声明 -

private class Node<Item extends Comparable<Item>>{
Item item;
Node next;
}

告诉编译器你正在创建一个私有(private)类,它有一个名为 Item 的类型参数, 并且是 Comparable<Item> 的子类型.在类型删除期间,这 Item将被其边界替换,类型为 Comparable .这就是您需要显式转换的原因。

此外,下面一行 -

private Node head;

创建原始类型 Node , 没有任何可用的类型信息。您应该收到此行的警告。

要解决此问题,请声明您的 head如下——

private Node<Item> head;

并通过以下方式创建实例 -

head = new Node<Item>();  // if you are using jdk 6 or lesser
head = new Node<>(); // if you are using jdk 7

更新所有 Node以类似的方式引用,您的警告应该消失。

如果您需要进一步说明类型参数绑定(bind),您可以阅读 one of my blog posts我试图解释类型参数绑定(bind)的工作原理。

关于java - 需要在 Java 中转换为通用类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18358029/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com