1

このコードから私が理解しているのは、genericDao はTypeLiteral<T>T が Bean.class を拡張する型のオブジェクトを返すことになっているということです。

public <T extends Bean> TypeLiteral<T> genericDao() {
        return (TypeLiteral<T>) TypeLiteral.get(Types.newParameterizedType(
                        GenericDao.class, type, getKey()));
    }

しかし、メソッドはこのように書かれるべきではありませんか?

public  TypeLiteral< T extends Bean> genericDao() {
        return (TypeLiteral<T>) TypeLiteral.get(Types.newParameterizedType(
                        GenericDao.class, type, getKey()));
    }
4

3 に答える 3

3

これがジェネリック メソッドの構文です。

<T extends Bean>メソッド宣言のは、メソッドがジェネリックを使用していることを示しTており、メソッド本体内で型として使用できます。

あなたのコードでTは、意味がありません。

于 2013-09-12T06:46:07.003 に答える
3

ジェネリック メソッドの場合、パラメーター化された型の指定は戻り値の型とは別です。ここで例を参照してください。例えば:

static <T> void fromArrayToCollection(T[] a, Collection<T> c) {
    for (T o : a) {
        c.add(o); // Correct
    }
}

したがって、この例は void を返しますが、でパラメータ化されてい<T>ます。あなたの場合、パラメータ化し<T extends Bean>て返しTypeLiteral<T>ます。2番目の例では、メソッドがジェネリックメソッドとしてではなく通常のメソッドとして宣言されているため、コンパイラは T の型を認識しません。

于 2013-09-12T06:49:36.637 に答える
1

Java 言語仕様の複雑な詳細には触れずに、構文の単純な理由は、メソッド宣言内で型パラメーター T を複数回使用できるためです。たとえば、次のようになります。

public <T extends Bean> TypeLiteral<T> genericDao(T param1, T param2) {
  T localvar1;
  T localvar2;
  ...
}

毎回指定する必要T extends Beanがあるのは冗長で不必要です

于 2013-09-12T06:46:23.050 に答える