我确实有一个定义了委托接口的抽象类:
public abstract class MyAbstractClass extends AsyncLoader {
public interface MyAbstractClassDelegate<M> {
//The parameter in this method should be the concrete subtype of MyAbstractClass
public M performThisCall(MyAbstractClass concreteSubclassOfAbstractClass);
}
private MyAbstractClassLoaderDelegate delegate;
...
}
问题是,我不希望委托参数为MyAbstractClass
,而应该是具体的子类。为什么?因为委托的实现需要具体的子类来进一步处理,我不想强制转换它......
我知道我可以在每个子类中定义Interface
,但除了参数类型
修改 的
这是解决我想要的完美解决方案。非常感谢!
public abstract class MyAbstractClass {
public interface MyAbstractClassDelegate<M, Subtype extends MyAbstractClass> {
public M myMethod(Subtype t);
}
}
这可能是 java 6 ,如果是 - 如何?
答案 0 :(得分:1)
我的解决方案是:
public final class Example<T extends Example<T>> {
public interface Interface<M, Subtype extends Interface<M, Subtype>> {
public M myMethod(Subtype t);
}
}
您无法从界面内的外部类访问泛型(因为该接口是静态的),因此您必须再次声明它。
如果你使用你的界面,你会得到这样的东西:
private static class Impl1 implements Interface<String, Impl1> {
@Override
public String myMethod(final Impl1 t) {
return null;
}
}
我不知道它是否会有所帮助,但这是我的完整示例:
public final class Example<M, T extends Example.Delegate<M, T>> {
public interface Delegate<M, Subtype extends Delegate<M, Subtype>> {
public M myMethod(Subtype t);
}
private T delegate;
private static class Impl1 implements Delegate<String, Impl1> {
@Override
public String myMethod(final Impl1 t) {
return null;
}
}
public static void main(String[] args) {
Example<String, Impl1> example = new Example<>();
example.delegate = new Impl1();
example.delegate.myMethod(example.delegate); //works but whout?
}
}
答案 1 :(得分:0)
你可以做的是给你的抽象类一个带有具体子类的类型参数,类似于Java Enum
的方式。
有些事情如下:
public abstract class MyAbstractClass<S extends MyAbstractClass<S>> extends AsyncLoader {
public interface MyAbstractClassDelegate<M, S> {
public M performThisCall(S concreteSubclassOfAbstractClass);
}
...