返回两个或多个泛型类型的 Java 方法

标签 java generics

关于返回泛型类型的 Java 方法有很多问题,但到目前为止没有一个问题能帮助我解决。

这是我的代码:

interface DAO<K, T> {
   void    insert(T t);
   void    update(K k, T t);
   void    delete(K k);
   void    delete();
   T       select(K k);
   List<T> select();
}

public class CourseDAO implements DAO<String, Course> {
   public void         insert(Course t) {}
   public void         update(String k, Course t) {}
   public void         delete(String k) {}
   public void         delete() {}
   public Course       select(String k) {}
   public List<Course> select() {}
}

public class StudentDAO implements DAO<Long, Student> {
   public void          insert(Student t) {}
   public void          update(Long k, Student t) {}
   public void          delete(Long k) {}
   public void          delete() {}
   public Student       select(Long k) {}
   public List<Student> select() {}
}

public enum EntityType { COURSE, STUDENT }

现在我想要一个工厂方法,它接受 EntityType 参数并根据参数值返回 CourseDAOStudentDAO 的实例。

我尝试了下面的代码,但没有成功:

public <K,T> DAO<K,T> createDAOFactory(EntityType type) {
   switch (type) {
      case COURSE  : return (K,T) new CourseDAO();  break;
      case STUDENT : return (K,T) new StudentDAO(); break;
   }
   return null;
}

有人可以帮我编写和调用这个方法吗???

干杯,
罗马尔多。

最佳答案

您要找的 Actor 是(DAO<K,T>) 。但是您会收到警告,因为泛型类型删除使其不安全。 switch中的另一个固有风险工厂的一个问题是你可能会忘记创建相应的 case当您添加新的EntityType时。更安全的选择是重新定义 EntityType具有泛型类型,并让它成为工厂。不幸的是,使用正确的枚举是不可能的,但您可以像这样模拟它:

abstract class EntityType<K, T> {
    public abstract DAO<K, T> createDAO();

    public static final EntityType<String, Course> COURSE = new EntityType<String, Course>() {
        @Override
        public DAO<String, Course> createDAO() {
            return new CourseDAO();
        }
    };
    public static final EntityType<Long, Student> STUDENT = new EntityType<Long, Student>() {
        @Override
        public DAO<Long, Student> createDAO() {
            return new StudentDAO();
        }
    };
}

或者您可以使用 lambda 来减少样板代码:

class EntityType<K, T> {
    private final Supplier<DAO<K, T>> constructor;

    private EntityType(Supplier<DAO<K, T>> constructor) {
        this.constructor = constructor;
    }

    public DAO<K, T> createDAO() {
        return constructor.get();
    }

    public static final EntityType<String, Course> COURSE = new EntityType<>(CourseDAO::new);
    public static final EntityType<Long, Student> STUDENT = new EntityType<>(StudentDAO::new);
}

现在,不要打电话 createDAOFactory(EntityType.COURSE) ,您只需调用 EntityType.COURSE.createDAO() .

关于返回两个或多个泛型类型的 Java 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45685105/

相关文章:

swift - associatedType 在另一个 associatedType 中使用协议(protocol)

r - 如何转置数据框,使用R保留行和列名称

java - 用于 Java 的简单 Web 服务器和 MVC 框架

c# - 为什么 C# 中不包含 Java "throws"子句(在方法声明中)?

c# - 如何对 KeyedCollection<TKey, TItem> 进行排序?

.net - 为什么不总是使用泛型?

java - 字符串扩展实用程序

java - 如何在不重新启动应用程序的情况下重新打开 Java 控制台?

java - GridBagLayout 元素不移动

generics - 具有静态解析类型参数的类型的自定义相等性