[英]Using Generics and extending Abstract classes
我已經對這個問題進行了大量研究,但是未能成功找到適合我情況的解決方案。 如果有多余,我深表歉意。
無論如何,我是泛型新手,因此我對語法尚不完全清楚。 但是這是我的情況:
我有一個接口(我們稱其為IService )和一個實現( ServiceImpl )。 實現類具有一個抽象方法,該抽象方法將被擴展類( ServiceExt )覆蓋。
我有一個抽象bean(我們稱它為AbstractBean ),它具有幾個字段,並且打算由另一個bean( BeanExt )進行擴展以添加更多字段。
好的,現在情況已經擺好了,這是我的縮寫代碼:
接口:
public interface IService <B extends AbstractBean> {
B method(B bean, Object data) throws Exception;
}
執行:
public abstract class ServiceImpl <B extends AbstractBean> implements IService<B> {
public abstract B method(B bean, Object data);
}
抽象豆 :
public abstract class AbstractBean{
private String fname;
private String lname;
[getters and setters]
}
擴展Bean:
public class BeanExt extends AbstractBean{
private String phoneNum;
[getter and setter]
}
擴展班:又名班給我問題
public class ServiceExt <B extends AbstractBean> extends ServiceImpl <B> {
@Override
public <B> BeanExt method(Bbean, Object data) {
if(beaninstanceof AbstractBean){
BeanExt beanExt = (BeanExt) session;
beanExt.setFname("John");
beanExt.setLname("Doe");
beanExt.setPhoneNum("123456789");
return beanExt;
}else{
return null;
}
}
}
好的,所以現在eclipse給了我各種各樣的非描述性問題,我不知道該怎么辦。 我已經大量使用了擴展類方法,但沒有成功。 以上是我最后一次修修補補后的樣子。
我的IDE當前在ServiceExt類中提出的問題是:
編輯:為了進一步澄清,我最終想做的是:
更新 -我已接受您的所有輸入,所做的更改如下所示。 我的IDE當前在ServiceExt類中提出的問題是:
接口:
public interface IService <B extends AbstractBean> {
B method(B bean, Object data) throws Exception;
B otherMethod(HttpServletRequest request) throws Exception;
}
執行:
public abstract class ServiceImpl <B extends AbstractBean> implements IService<B> {
public abstract B method(B bean, Object data);
@Override
public final B otherMethod(HttpServletRequest request) {
return [something];
}
}
抽象豆 :
public abstract class AbstractBean{
private String fname;
private String lname;
[getters and setters]
}
擴展Bean:
public class BeanExt extends AbstractBean{
private String phoneNum;
[getter and setter]
}
擴展班:又名班給我問題
public class ServiceExt extends ServiceImpl <BeanExt> {
@Override
public BeanExt method(BeanExt bean, Object data) {
BeanExt beanExt = (BeanExt) session;
beanExt.setFname("John");
beanExt.setLname("Doe");
beanExt.setPhoneNum("123456789");
return beanExt;
}
}
您並沒有真正重寫超類中的方法。 這是重寫的方法:
@Override
public BeanExt method(BeanExt bean, Object data) {
BeanExt beanExt = (BeanExt) session;
beanExt.setFname("John");
beanExt.setLname("Doe");
beanExt.setPhoneNum("123456789");
return beanExt;
}
由於您是從ServiceImpl<BeanExt>
擴展而來的,因此類型參數B
被BeanExt
類型替換, BeanExt
的返回類型和參數也被替換。
還要注意,我已經刪除了instanceof
檢查,因為實際上並不需要它。 bean
將始終是AbstractBean
的實例,因為它由您對ServiceImpl
類的類型參數聲明賦予的綁定強制執行。
我不完全了解您要做什么,但這可以接受嗎?
public class ServiceExt <B extends BeanExt> extends ServiceImpl <B> {
@Override
public B method(B bean, Object data) {
bean.setFname("John");
bean.setLname("Doe");
bean.setPhoneNum("123456789");
return bean;
}
}
我只是糾正了所有錯誤:
interface IService <B extends AbstractBean> {
B method(B bean, Object data) throws Exception;
}
abstract class ServiceImpl <B extends AbstractBean> implements IService<B> {
public abstract B method(B bean, Object data);
}
abstract class AbstractBean{
String fname;
String lname;
}
class BeanExt extends AbstractBean {
String phoneNum;
}
class ServiceExt <B extends AbstractBean> extends ServiceImpl <B> {
@Override public B method(B bean, Object data) {
if (bean instanceof BeanExt) {
BeanExt beanExt = (BeanExt) bean;
beanExt.fname = "John";
beanExt.lname = "Doe";
beanExt.phoneNum = "123456789";
return bean;
}else{
return null;
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.