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();
}
您可以為每個實現提供與為泛型類型提供的相同的類。
添加回答
舉報