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>。在您的第二个示例中,编译器将不知道 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 回答