使用相同的类型参数创建类型变量

时间:2015-05-22 19:10:44

标签: java

我必须创建一个二进制搜索树,它以WordCount对象作为键,以及将该字添加到BST作为值的次数。在我的代码中,我有类:

public class WordCountMap<WordCount, V> {
    private TreeNode root;
    private WordCount wordItem;

   /**
    * This is the node class
    */
   private class TreeNode {
        private WordCount item;
        private V count;
        private TreeNode left;
        private TreeNode right;

        TreeNode(WordCount item, V count, TreeNode left, TreeNode right) {
            this.left = left;
            this.right = right;
            this.item = item;
        }
    }

    public WordCountMap() {
        //Create a new WordCountMap
    }

    /**
     * Adds 1 to the existing count for a word, or adds word to the WordCountMap
     * with a count of 1 if it was not already present.
     */ 
     public void incrementCount(String word) {
          wordItem = new WordCount(word);
          if (root == null) {
              root = new TreeNode(wordItem, wordItem.getCount(), null, null);
          }
          //more code below
    }
}

当我尝试编译代码时,我收到错误:

WordCount extends Object declared in class WordCountMap

我尝试了@SuppressWarnings("rawtypes"),但仍然导致了同样的错误。

1 个答案:

答案 0 :(得分:4)

看起来你没有正确使用泛型。

想象一下,您用WordCount替换了T的所有实例(无论哪种方式都是相同的程序)。在incrementCount()中,您有一行wordItem = new T(word);,但这没有意义,因为您不知道T是否具有带String参数的构造函数。

由于看起来您总是希望密钥属于WordCount类型,因此您可能需要按如下方式声明该类。

public class WordCountMap<V> {}

但是你想要计数的类型是任何对象吗?计数类型可以是String,Stack还是InputStream?你可以在更安全的一面宣布课程为。 。 。

public class WordCountMap<V extends Number> {}

但即便如此,为什么你希望伯爵是通用的呢?你打算让这堂课由另一堂课延长吗?是否有任何理由计数类型不能只是int或long?我会删除所有泛型,只使用一些原始数字类型进行计数

public class WordCountMap { 
    ... 
    private class TreeNode { 
        ... 
        private int count;
    }
}