3 回答

TA貢獻(xiàn)1843條經(jīng)驗(yàn) 獲得超7個(gè)贊
您可以創(chuàng)建一個(gè)抽象函數(shù)來返回子類的對象。像這樣的東西會起作用。這是示例代碼,其中接口返回作為實(shí)現(xiàn)該接口的類的對象列表。
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貢獻(xiàn)1802條經(jīng)驗(yàn) 獲得超5個(gè)贊
我重組了該項(xiàng)目,將接口與其實(shí)現(xiàn)分開。現(xiàn)在,擴(kuò)展接口的(抽象)實(shí)現(xiàn)的每個(gè)類在調(diào)用超級構(gòu)造函數(shù)時(shí)都會設(shè)置類型“Class”的屬性,抽象類中的每個(gè)函數(shù)都引用該屬性。
有沒有更好的辦法?這種方法有哪些潛在問題?
界面:
public interfaceObjSvcIntf {
<Entity> Object getById(Long id);
}
實(shí)現(xiàn)抽象類:
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);
}
}
服務(wù)等級:
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貢獻(xiàn)1802條經(jīng)驗(yàn) 獲得超6個(gè)贊
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();
}
您可以為每個(gè)實(shí)現(xiàn)提供與為泛型類型提供的相同的類。
添加回答
舉報(bào)