簡體   English   中英

使用泛型和擴展Abstract類

[英]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類中提出的問題是:

  • ServiceImpl類型的方法method(B,Object)必須重寫或實現一個超類型方法
  • 類型ServiceExt必須實現繼承的抽象方法[接口中的其他一些非抽象方法]

編輯:為了進一步澄清,我最終想做的是:

  • 創建一個擴展AbstractBean的bean並添加另一個字段
  • 在類ServiceExt中定義抽象方法
  • 在方法內,在擴展bean中設置一些值
  • 返回具有新值的擴展bean

更新 -我已接受您的所有輸入,所做的更改如下所示。 我的IDE當前在ServiceExt類中提出的問題是:

  • 類型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>擴展而來的,因此類型參數BBeanExt類型替換, 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM