Java 使用泛型和扩展抽象类

Java 使用泛型和扩展抽象类,java,generics,abstract,Java,Generics,Abstract,我已经对这个问题进行了大量研究,但并没有很成功地找到一个接近我的情况的解决方案。如果我是多余的,我道歉 无论如何,我是泛型新手,所以我对语法不是很清楚。但我的情况是: 我有一个接口(我们称之为IService)和一个实现(ServiceImpl)。实现类有一个抽象方法,该方法将被扩展类(ServiceExt)覆盖 我有一个抽象bean(我们称之为AbstractBean),它有几个字段,并打算由另一个bean(BeanExt)扩展,以便添加更多字段 好的,现在情况已经安排好了,下面是我的缩写代码

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

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

我有一个接口(我们称之为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 class BeanExt extends AbstractBean{

    private String phoneNum;

    [getter and setter]
}
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 class BeanExt extends AbstractBean{

    private String phoneNum;

    [getter and setter]
}
扩展Bean:

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 class BeanExt extends AbstractBean{

    private String phoneNum;

    [getter and setter]
}
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 class BeanExt extends AbstractBean{

    private String phoneNum;

    [getter and setter]
}
扩展类:aka类给我问题

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;
        }
    }
}
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;
    }
}
扩展Bean:

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 class BeanExt extends AbstractBean{

    private String phoneNum;

    [getter and setter]
}
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 class BeanExt extends AbstractBean{

    private String phoneNum;

    [getter and setter]
}
扩展类:aka类给我问题

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;
        }
    }
}
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;
    }
}
公共类ServiceExt扩展ServiceImpl{
@凌驾
公共BeanExt方法(BeanextBean,对象数据){
BeanExt BeanExt=(BeanExt)会话;
beanExt.setFname(“约翰”);
beanExt.setLname(“Doe”);
setPhoneNum(“123456789”);
返回beanExt;
}
}

我不完全理解您的意图,但这是否可以接受/有效

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;
    }
}
公共类ServiceExt扩展ServiceImpl{
@凌驾
公共B方法(B bean、对象数据){
bean.setFname(“约翰”);
设置名称(“Doe”);
setPhoneNum(“123456789”);
返回豆;
}
}

您并不是在超类中真正重写该方法。下面是被重写的方法:

@Override
public BeanExt method(BeanExt bean, Object data) {
        BeanExt beanExt = (BeanExt) session;
        beanExt.setFname("John");
        beanExt.setLname("Doe");
        beanExt.setPhoneNum("123456789");
        return beanExt;
}
由于您是从
serviceinpl
进行扩展,因此类型参数
B
将替换为
BeanExt
类型,方法的返回类型和参数也将替换为
BeanExt
类型


还请注意,我已经删除了
instanceof
检查,因为它实际上并不需要
bean
将始终是
AbstractBean
的一个实例,因为这是由您对
ServiceImpl
类的类型参数声明的绑定强制执行的。

我刚刚更正了所有错误:

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;
        }
    }
}
接口设备{
B方法(B bean,对象数据)抛出异常;
}
抽象类ServiceImpl实现IService{
公共抽象B方法(B bean,对象数据);
}
抽象类AbstractBean{
字符串fname;
字符串名称;
}
类BeanExt扩展了AbstractBean{
字符串phoneNum;
}
类ServiceExt扩展ServiceImpl{
@重写公共B方法(B bean、对象数据){
if(beanInstanceof beanNext){
BeanExt BeanExt=(BeanExt)bean;
beanExt.fname=“John”;
beanExt.lname=“Doe”;
beanExt.phoneNum=“123456789”;
返回豆;
}否则{
返回null;
}
}
}

您的
serviceinpl
未编译。
实现iSeries功能
是打字错误吗?它应该是
实现IService
。请查收。对不起,已经更正了。我很困惑。似乎我们都解决了您的第一个问题(即编译器错误)。你的问题现在改变了吗?请注意,这使得帮助您变得相当困难。什么?你是否根据答案修改了你的问题?所有答案现在都无效。@Mike您修改的代码应该可以正常工作。