Java泛型静态类型推断

时间:2014-02-21 11:08:16

标签: 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(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 ,如果是 - 如何?

2 个答案:

答案 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);
    }

...