Java泛型静态类型推断
我确实有一个定义了委托接口的抽象类:Java泛型静态类型推断,java,generics,type-inference,Java,Generics,Type Inference,我确实有一个定义了委托接口的抽象类: 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(MyAb
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;
...
}
}
这在Java6中是可能的吗?如果是的话,怎么做?您可以为抽象类提供一个带有具体子类的类型参数,类似于java的
Enum
的方式
大致如下:
public abstract class MyAbstractClass<S extends MyAbstractClass<S>> extends AsyncLoader {
public interface MyAbstractClassDelegate<M, S> {
public M performThisCall(S concreteSubclassOfAbstractClass);
}
...
公共抽象类MyAbstractClass扩展了AsyncLoader{
公共接口MyAbstractClassDelegate{
公共M执行此调用(S具体子类FabstractClass);
}
...
我的解决方案是:
public final class Example<T extends Example<T>> {
public interface Interface<M, Subtype extends Interface<M, Subtype>> {
public M myMethod(Subtype t);
}
}
公共最终类示例{
公共接口{
公共M-myMethod(t亚型);
}
}
您无法从接口内部的外部类访问泛型(因为接口是静态的),因此必须再次声明它
如果使用您的界面,您会得到如下结果:
private static class Impl1 implements Interface<String, Impl1> {
@Override
public String myMethod(final Impl1 t) {
return null;
}
}
私有静态类Impl1实现接口{
@凌驾
公共字符串myMethod(最终执行){
返回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?
}
}
公共最终类示例{
公共接口委托{
公共M-myMethod(t亚型);
}
私人T代表;
私有静态类Impl1实现委托{
@凌驾
公共字符串myMethod(最终执行){
返回null;
}
}
公共静态void main(字符串[]args){
示例=新示例();
example.delegate=new Impl1();
example.delegate.myMethod(example.delegate);//可以工作,但怎么办?
}
}
我已经试过了,不幸的是编译器说“MyAbstractClass.this不能从静态上下文引用”@Alexander示例和您的问题中没有静态上下文,因此您在其他地方犯了错误。@Alexander它给出错误消息的代码是什么?@Smallhackerinterface@Alexander您是否试图用类Abc扩展MyAbstractClass
声明子类?如果是,则不是这样。您我想用Abc类扩展MyAbstractClass。很好,子类型可以工作,尽管子类型扩展MyAbstractClass是我想要的
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?
}
}