gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 12:22:13 25 4
gpt4 key购买 nike

关于返回泛型类型的 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com