2011-05-20 122 views
0

这么长的故事短我有一个对象模型,其中几个不同的实体类型共享一个共同的超类型。从这个超类型派生的任何类型都拥有与之相关的User,并且我想提供一个通用实用程序函数,该函数可以返回属于指定User的给定类型的所有实体。Java - 正确声明通用函数的方法?

所有这一切工作正常,但我的函数声明如下:

public static <T> List<T> findByUser(Class<T> entityClass, User user, EntityManager em) 

...虽然这是由编译器所接受,语法看起来有点怪我。这是用泛型返回类型声明函数的正确方法吗?理想的情况是什么,我想有更多的东西,如:

public static List<T> findByUser(Class<T extends MySuperClass> entityClass, User user, EntityManager em) 

但是编译器不喜欢,在所有。所以,我的具体问题是:

  1. 有什么办法static后摆脱看似虚假<T>元素?
  2. 我需要用什么语法使编译器强制执行T必须从我的超类类型派生?

回答

1
public static <T extends MySuperClass> List<T> findByUser(Class<T> entityClass, User user, EntityManager em) 

应该工作。

方法签名中需要<T extends MySuperClass>(在static之后),因为这是定义类型T的边界的地方。

1

<T>在static告诉编译器该函数应该是通用的并且允许你在其中设置约束之后。

public static <T extends MySuperClass> List<T> findByUser(Class<T> entityClass, User user, EntityManager em) 
1

你想这样的:

public static <T extends MySuperClass> List<T> findByUser(Class<T> entityClass, User user, EntityManager em) 

的“虚假” <T>(或现在<T extends MySuperClass>)是在方法签名中使用泛型类型参数(一个或多个)的声明(返回和参数类型)。

基本上,签名现在说“调用此方法总是涉及一类T扩展MySuperClass,并且第一个参数必须是一个Class对象,表示T,并且返回类型将是一个List<T>