我正在尝试定义一个泛型类,它可以使用定义了Comparable
接口的任何数据类型。
错误消息是compareTo(Key) in java.lang.Comparable<Key> cannot be applied to (java.lang.Comparable) on line 22
TreeNode
类声明有关,但我无法弄清楚它是什么。
Warnings [unchecked] unchecked call to TreeNode(Key) as a member of the raw type findLargestKElementsInTree.TreeNode on line 16
class findLargestKElementsInTree<Key extends Comparable<Key>>{
TreeNode root;
int count=1;
public void insert(Key k)
{
this.insert(k,root,root);
}
private void insert(Key k, TreeNode node,TreeNode parent)
{
if(this.root==null)
root=new TreeNode(k);
if(node==null)
{
node=new TreeNode(k);
if(parent != null)
{
if(k.compareTo(parent.data)<0)
parent.left=node;
else
parent.right=node;
}
}
else
{
if(node.data.compareTo(k)>0)
insert(k,node.left,node);
else if(node.data.compareTo(k)<0)
insert(k,node.right,node);
else
return;
}
}
public void printK(int k)
{
postOrderK(root,k);
}
/*
* 42
* 40
* 20 25
* 10
* 5
*
*
*
* */
public void postOrderK(TreeNode n,int k)
{
if(n==null)
return;
if(n.right!=null)
postOrderK(n.right,k);
if(count <= k)
{
System.out.println(count+" largest number "+n.data);
count++;
}
postOrderK(n.left,k);
}
public class TreeNode<Key extends Comparable<Key>>{
Key data;
TreeNode left;
TreeNode right;
TreeNode(Key d)
{
this.data=d;
this.left=null;
this.right=null;
}
}
public static void main(String[] args)
{
findLargestKElementsInTree<Integer> tree=new findLargestKElementsInTree<Integer>();
tree.insert(20);
tree.insert(40);
tree.insert(10);
tree.insert(5);
tree.insert(42);
tree.insert(25);
tree.printK(7);
}
}
我已经查看了有关堆栈溢出的其他问题,似乎有助于解决类似的问题,但建议的解决方案是使用泛型类,我想我已经有了。
提前致谢!
答案 0 :(得分:3)
查看您方法的签名:
private void insert(Key k, TreeNode node, TreeNode parent) {
您的node
和parent
参数具有原始TreeNode
类型,但TreeNode
是通用类。通过适当参数化来修复它:
private void insert(Key k, TreeNode<Key> node, TreeNode<Key> parent) {
root
,left
和right
个实例变量相同。
答案 1 :(得分:1)
我认为您缺少的是声明root
实例使用泛型类型TreeNode<Key>
而不是原始类型TreeNode
:
class findLargestKElementsInTree<Key extends Comparable<Key>>{
TreeNode<Key> root;
...
您应该将原始类型TreeNode
的所有地点替换为TreeNode<Key>
。