java泛型编译错误,堆栈上的泛型类

时间:2013-12-13 07:47:04

标签: java generics

我不确定为什么这在Java中不起作用:

import java.util.Map;

public class FreqCounter<T,R> {
    private Map<T, Integer> hist;
    private R item;
    public FreqCounter (final R item_) {
        item = item_;
    }
    public T getMostFrequentElement() {
        T most_frequent_element = T();
        Integer highestcount = 0;
        for(T t : item) {
            Integer count = hist.get(t);
            if(count == null) {
                hist.put(t, 1);
            }
            else {
                hist.put(t, count + 1);
            }
            if(count + 1 > highestcount) {
                most_frequent_element = t;
                highestcount = count + 1;
            }
        }
        return most_frequent_element;
    }
}


class HelloWorld {
    public static void main(String[] args) {
        String s = "aaabbcccc";
        FreqCounter<Character, Integer> counter = new FreqCounter<Character, Integer>(s);
    }
}

问题线:

 1. T most_frequent_element = T();
 2. for(T t : item)
 3. FreqCounter<Character, Integer> counter = new FreqCounter<Character, Integer>(s);
  1. 找不到符号:方法T()
  2. required:array或java.lang.Iterable,found:R
  3. 必需的java.lang.Integer 发现:java.lang.String 原因:实际参数java.lang.String无法通过方法调用转换转换为java.lang.Integer
  4. 我试图做的是创建一个可以计算可迭代容器中元素出现次数的类。最初我只是想让它计算一个字符串中的字符,但我想我可以使它更通用。我认为其中一些可以在C ++中使用吗?

    此外,FreqCounter<Character, Integer> counter = new FreqCounter<Character, Integer>(s);需要被新的&#34;而不是在堆栈上声明?

1 个答案:

答案 0 :(得分:2)

T是一个通用类型,而不是真正的类型,泛型的一个限制是你不能实例化一个新的(这是我认为你在这里尝试做的)。

你可以做的是分配,调用方法,保留引用,重复引用等等。

您可能真正想要做的是从T的{​​{1}}中提取keySet。{/ p>

Map

Java Generics提供了许多与C ++模板相同的功能,但它们以完全不同的方式工作。除了其他任何东西,你只有一个T t = null; int count = 0; for (Entry<T, Integer> e: hist.entrySet()) { if (e.getValue() > count) { count = e.getValue(); t = e.getKey(); } } return t; 类,无论你实例化多少种不同的方法。泛型用于编译器时间类型检查,然后擦除,并且在运行时根本不存在。