Java - 声明泛型函数的正确方法?

时间:2011-05-20 00:04:06

标签: java generics

这么长的故事简短我有一个对象模型,其中几个不同的实体类型共享一个共同的超类型。从这个超类型派生的任何类型都有一个与之关联的拥有User,我想提供一个通用的实用程序函数,它可以返回属于指定User的给定类型的所有实体。

所有这些都很好,但我的函数声明如下:

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. 有没有办法摆脱<T>之后看似虚假的static元素?
  2. 我需要使用什么语法来强制编译器强制T必须从我的超类类型派生?

3 个答案:

答案 0 :(得分:1)

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

应该有效。

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

你想要这个:

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

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

基本上,签名现在说“调用此方法总是涉及扩展T的类MySuperClass,第一个参数必须是代表Class的{​​{1}}对象,返回类型为T