0

私は単純なクラスを作成します(StringPools自体のメリットは私の質問ではありません。このクラスが必要な特定の理由があります):

import java.lang.ref.WeakReference;
import java.util.WeakHashMap;

public final class StringPool {

    private WeakHashMap m_pool = new WeakHashMap();

    public String intern(String s) {
        WeakReference reference = (WeakReference)m_pool.get(s);
        if(reference != null) {
            String interned = (String)reference.get();
            if(interned != null)
                return interned;
        }
        m_pool.put(s,new WeakReference(s));
        return s;
    }
};

私がそれをコンパイルするとき、コンパイラはそれがチェックされていないまたは安全でない操作を使用していることに気づきます:

warning: [unchecked] unchecked call to WeakReference(T) as a member of the raw type WeakReference       
    m_pool.put(s,new WeakReference(s));
    ^   where T is a type-variable:
    T extends Object declared in class WeakReference 

warning: [unchecked] unchecked call to put(K,V) as a member of the raw type WeakHashMap 
    m_pool.put(s,new WeakReference(s));
    ^   where K,V are type-variables:
    K extends Object declared in class WeakHashMap
    V extends Object declared in class WeakHashMap

2 warnings

コードがクリーンにコンパイルされて正しくなるように、これらの警告をどのように修正する必要がありますか?

4

2 に答える 2

1

ジェネリックを追加します。

WeakHashMap<String, WeakReference<String>>

キャストを削除します:

(WeakReference)m_pool.get(s);

と:

(String)reference.get()

のように見えるように:

m_pool.get(s);

reference.get()

それぞれ。

于 2012-08-16T07:45:27.873 に答える
1

ジェネリックを使用する:

public final class StringPool {

    private WeakHashMap<String, WeakReference<String>> m_pool = new WeakHashMap<String, WeakReference<String>>();

    public String intern(String s) {
        WeakReference<String> reference = m_pool.get(s);
        if (reference != null) {
            String interned = reference.get();
            if (interned != null)
                return interned;
        }
        m_pool.put(s, new WeakReference<String>(s));
        return s;
    }
};
于 2012-08-16T07:46:13.010 に答える