我从这段代码中理解的是,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()));
}
答案 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
是多余且不必要的