簡體   English   中英

java泛型編譯錯誤,堆棧上的泛型類

[英]java generics compile error, generic class on the stack

我不確定為什么這在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

我試圖做的是創建一個可以計算可迭代容器中元素出現次數的類。 最初我只是想讓它計算一個字符串中的字符,但我想我可以使它更通用。 我認為其中一些可以在C ++中使用?

另外, FreqCounter<Character, Integer> counter = new FreqCounter<Character, Integer>(s) ; 需要被“新化”而不是在堆棧上聲明?

T是泛型類型,而不是真實類型,泛型的一個限制是你不能實例化一個新的(這是我認為你在這里嘗試做的)。

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

你可能真正想要做的是從MapkeySet中拉出一組T s。

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;

Java Generics提供了許多與C ++模板相同的功能,但它們以完全不同的方式工作。 除了其他任何東西,你只有一個ArrayList類,無論你實例化多少種不同的方法。 泛型用於編譯器時間類型檢查,然后擦除,並且在運行時根本不存在。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM