我有以下情况:
通用界面
public interface AbstractObject {
...
}
扩展界面的一些特定类
public class RealObject implements AbstractObject {
...
}
public class TrueObject implements AbstractObject {
...
}
通用抽象类:
public abstract class AbstractManager extends OtherManager {
public abstract AbstractObject get(AbstractObject obj);
public abstract AbstractObject put(AbstractObject obj);
}
我需要一个扩展AbstractManager的类,并使用AbstractObject类的扩展来实现它的方法,如下所示:
public class ConcreteManager extends AbstractManager {
@Override
public TrueObject get(TrueObject trueObj){
...
return tobj;
}
@Override
public TrueObject put(RealObject realObj2){
...
return tobj;
}
}
可能吗?
答案 0 :(得分:0)
不是你写的方式。请记住,你必须能够在任何可以使用超类的地方使用子类的实例,因此子类的返回类型必须至少与超类一样具体(你在这里很好),并且它的参数类型必须最多特定于超类(这是你的问题)。使用AbstractManager
的代码需要能够将任何旧AbstractObject
传递给get
和put
,因此您无法在ConcreteManager
中要求更具体的内容。
Java Generics提供了一种“定制”特定类型接口的方法;例如,请参阅像List
这样的集合类型。这有点棘手,可能会或可能不值得额外的复杂功能,具体取决于您的具体用例。
答案 1 :(得分:0)
覆盖方法时可以缩小方法的返回类型,但不能缩小参数的类型。
解决方案是使您的类具有通用性,因此您可以使用泛型指定方法参数的类型。
将通用类型参数添加到抽象类中。
public abstract class AbstractManager<
T1 extends AbstractObject, T2 extends AbstractObject>
extends OtherManager
{
public abstract T1 get(T1 obj);
public abstract T1 put(T2 obj);
}
然后,您可以指定子类中的T
:
public class ConcreteManager extends AbstractManager<TrueObject, RealObject>
{
@Override
public TrueObject get(TrueObject trueObj) {/* Implementation */}
public TrueObject put(RealObject realObj2) {/* Implementation */}
}
答案 2 :(得分:0)
我会用一种方法和 instanceof 运算符
来编写它public class ConcreteManager extends AbstractManager {
public AbstractObject get(AbstractObject trueObj) {
if(trueObj instanceof TrueObject) {
return trueObj;
} else if(trueObj instanceof RealObject) {
return trueObj;
} else {
// type unknown
return null;
}
}
}
泛型更复杂,在这里不需要。