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?
  }
}