这么长的故事简短我有一个对象模型,其中几个不同的实体类型共享一个共同的超类型。从这个超类型派生的任何类型都有一个与之关联的拥有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)
但是编译器完全不喜欢它。所以我的具体问题是:
<T>
之后看似虚假的static
元素?T
必须从我的超类类型派生?答案 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
。