3 回答
TA贡献1843条经验 获得超7个赞
您可以创建一个抽象函数来返回子类的对象。像这样的东西会起作用。这是示例代码,其中接口返回作为实现该接口的类的对象列表。
public interface ObjSvcIntf<E> {
default List<E> get(Boolean active) {
var list = new ArrayList<E>();
list.add(self());
return list;
}
E self(); // function to return the sub class instance
}
TA贡献1802条经验 获得超5个赞
我重组了该项目,将接口与其实现分开。现在,扩展接口的(抽象)实现的每个类在调用超级构造函数时都会设置类型“Class”的属性,抽象类中的每个函数都引用该属性。
有没有更好的办法?这种方法有哪些潜在问题?
界面:
public interfaceObjSvcIntf {
<Entity> Object getById(Long id);
}
实现抽象类:
public abstract class ObjSvcImpl implements ObjSvcIntf {
public Class<?> servicedClass;
// CONSTRUCTOR
public ObjSvcImpl(Class<?> servicedClass) {
this.servicedClass = servicedClass;
}
@Override
public <Entity> Object getById(Long id) {
return DB.getById(this.servicedClass, id);
}
}
服务等级:
public class ObjCarSvc extends ObjSvcImpl {
public ObjCarSvc() {
super(ObjCar.class);
}
}
型号类别:
@Entity
@Table(name = "OBJ_CAR")
public class ObjCar implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "OBJ_CAR_ID")
private Long objCarId;
@NotNull
@Column(name = "NAME")
private String name;
// Getters and Setters
}
TA贡献1802条经验 获得超6个赞
public interface ObjSvcIntf<Entity> {
default <Entity> ArrayList<Entity> get(Boolean active) {
@SuppressWarnings("rawtypes")
Query query = DB.s.createQuery("from " + getImplClass().getSimpleName() + " where active = :active");
query.setParameter("active", active);
return (ArrayList<Entity>) query.list();
}
Class getImplClass();
}
您可以为每个实现提供与为泛型类型提供的相同的类。
添加回答
举报