Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java—声明泛型函数的正确方法?_Java_Generics - Fatal编程技术网

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

Java—声明泛型函数的正确方法?,java,generics,Java,Generics,长话短说,我有一个对象模型,其中几个不同的实体类型共享一个公共超类型。从这个超类型派生的任何类型都有一个与之相关联的拥有者用户,我想提供一个通用实用程序函数,它可以返回属于指定用户的给定类型的所有实体 所有这些都很好,但我的函数声明如下所示: public static <T> List<T> findByUser(Class<T> entityClass, User user, EntityManager em) 公共静态列表findByUser(类ent

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

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

public static <T> List<T> findByUser(Class<T> entityClass, User user, EntityManager em)
公共静态列表findByUser(类entityClass、用户用户、EntityManager em)
…虽然编译器接受了这一点,但语法对我来说有点奇怪。这是使用泛型返回类型声明函数的正确方法吗?理想情况下,我想要的是:

public static List<T> findByUser(Class<T extends MySuperClass> entityClass, User user, EntityManager em)
公共静态列表findByUser(类entityClass、用户用户、EntityManager em)
但是编译器一点也不喜欢这样。因此,我的具体问题是:

  • 静态
    之后,是否有任何方法可以消除看似虚假的
    元素
  • 我需要使用什么语法使编译器强制
    T
    必须从我的超类类型派生
  • 公共静态列表findByUser(类entityClass、用户用户、EntityManager em)
    
    应该有用

    方法签名中需要
    (在
    static
    之后),因为类型
    T
    的边界就是在这里定义的。

    公共静态列表findByUser(类entityClass、用户用户、EntityManager em)
    
    应该有用

    方法签名中需要
    (在
    static
    之后),因为类型
    T
    的边界就是在这里定义的。

    static之后的
    告诉编译器函数应该是泛型的,并允许您在其中设置约束

    public static <T extends MySuperClass> List<T> findByUser(Class<T> entityClass, User user, EntityManager em)
    
    公共静态列表findByUser(类entityClass、用户用户、EntityManager em)
    
    static之后的
    告诉编译器函数应该是泛型的,并允许您在其中设置约束

    public static <T extends MySuperClass> List<T> findByUser(Class<T> entityClass, User user, EntityManager em)
    
    公共静态列表findByUser(类entityClass、用户用户、EntityManager em)
    
    您想要这个:

    public static <T extends MySuperClass> List<T> findByUser(Class<T> entityClass, User user, EntityManager em)
    
    公共静态列表findByUser(类entityClass、用户用户、EntityManager em)
    
    “伪”是方法签名(返回和参数类型)中使用的泛型类型参数的声明

    基本上,签名现在表示“调用此方法总是涉及一个扩展了
    MySuperClass
    的类
    T
    ,第一个参数必须是一个表示
    T
    class
    对象,返回类型将是一个
    List
    您想要这样:

    public static <T extends MySuperClass> List<T> findByUser(Class<T> entityClass, User user, EntityManager em)
    
    公共静态列表findByUser(类entityClass、用户用户、EntityManager em)
    
    “伪”是方法签名(返回和参数类型)中使用的泛型类型参数的声明

    基本上,签名现在表示“调用此方法总是涉及一个扩展了
    MySuperClass
    的类
    T
    ,第一个参数必须是一个表示
    T
    class
    对象,返回类型将是一个
    列表