使用泛型和扩展抽象类

时间:2014-03-26 14:57:15

标签: java generics abstract

我已经对这个问题进行了大量的研究,但在找到接近我的情况的解决方案方面并不是很成功。如果我多余,我道歉。

无论如何,我是泛型的新手,所以我对语法并不完全清楚。但这是我的情况:

我有一个接口(让我们称之为 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);
}

抽象Bean

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类型的方法方法(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]; 
    }
}

抽象Bean

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;
    }
}

3 个答案:

答案 0 :(得分:2)

你并没有真正重写超类中的方法。这是被覆盖的方法:

@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类型,方法的返回类型和参数也将替换。

另请注意,我已删除了instanceof支票,因为它确实不需要。 bean将始终是AbstractBean的实例,因为这是由您对ServiceImpl类的类型参数声明赋予的绑定强制执行的。

答案 1 :(得分:0)

我并不完全明白你要做什么,但这是否可以接受?

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;
    }
}

答案 2 :(得分:0)

我刚刚纠正了所有错误:

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;
        }
    }
}