我已经对这个问题进行了大量的研究,但在找到接近我的情况的解决方案方面并不是很成功。如果我多余,我道歉。
无论如何,我是泛型的新手,所以我对语法并不完全清楚。但这是我的情况:
我有一个接口(让我们称之为 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 类中提出的问题是:
修改:为了进一步澄清,我最终要做的是:
更新 - 我已经完成了所有输入,更改内容如下所示。我的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];
}
}
抽象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;
}
}
答案 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;
}
}
}