1
public static <T> T inCache(T obj) throws ClassNotFoundException {
        String[] token = validateCookie(); //gives me to strings
        if (token == null)
            return null;
        if (Cache.get(token[0]) != null) {
            if (Cache.get(token[0]).getClass() == Class.forName(token[1])
                    && obj.getClass() == Cache.get(token[0]).getClass()) {
                T test = (T) Cache.get(token[0]);
                return test;
            }
        }
        return null;
    }

上記のコードは完全に間違っています。

基本的に私はこのようなことをしたいです:

  • 関数にクラスを設定したい。例えばinCache<User>();
  • キャッシュから取得したオブジェクトに、以前に指定したものと同じクラスがあるかどうかを確認します。(obj.getClass == User.class)

  • クラスが一致する場合は、オブジェクトをクラスにキャストして返します。return (User)obj

こんな風に使いたいです。

User user = inCache<User>();
4

1 に答える 1

6

クラスの署名については、次のようなものを使用してみませんか。

public static <T> T inCache(Class<T> clazz) throws ClassNotFoundException {
  ...
}

そしてそれをこのように呼びます:

User user = inCache(User.class);

User user = inCache<User>();実行時の型消去のため、ジェネリックスは説明したように使用できません( )。つまり、Tその場合、実行時に型が不明になります。

Class#isAssignableFrom(...)また、サブクラスもチェックできるようにするために、を使用してテストする方がよい場合があることに注意してくださいclazz.isAssignableFrom(Cache.get(token[0]).getClass())。そうすれば、インターフェイスまたはスーパークラスを渡しても、オブジェクトがサブタイプの場合でも一致を取得できます。

于 2012-08-06T14:37:29.173 に答える