对这个泛型用例感到困惑

时间:2013-09-12 06:41:04

标签: java generics

我从这段代码中理解的是,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()));
    }

3 个答案:

答案 0 :(得分:3)

这是泛型方法的语法。

方法声明中的<T extends Bean>告诉我们该方法使用泛型,您可以在方法体内使用T作为类型。

在您的代码中,T没有任何意义。

答案 1 :(得分:3)

对于泛型方法,参数化类型规范与返回类型是分开的。请参阅示例here。例如:

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的类型,因为该方法不是声明为通用方法而是作为常规方法。

答案 2 :(得分:1)

没有进入Java语言规范的复杂细节,语法的简单原因是因为类型参数T可以在方法声明中多次使用,例如:

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

每次必须指定T extends Bean是多余且不必要的