繁体   English   中英

我可以推断Java中的子类型吗?

[英]Can I infer subtypes in Java?

我希望能够做到这一点:

    public class ConcreteA<B extends AbstractC<D>> {
      public D getD() {...}
    }

甚至:

    public class ConcreteA<B extends AbstractC<?>> {
      public <D> D getD() {return cInst.dRelatedMethod();}
    }

但似乎我必须这样做:

    public class ConcreteA<D, AbstractB extends C<D>> {
      public D getD() {...}
    }

如果D有其自己的类型参数,它将变得混乱。 有什么方法可以让这种类型的推断按我想要的方式工作吗? Java Community Process是否在工作中改进了类型推断?

符合条件的答案:
1)存在类型推断解决方案,该解决方案可以在不使用第3块中的解决方案的情况下提供我想要的东西
2)对任何寻求以适用方式改进类型推断的JSR的引用
3)驳斥该概念的有效性
4)权威声明,这种JSR不存在

当然! 例如,下面的代码编译(尽管我不知道为什么有人会需要这种奇怪的构造):

public class ConcreteA<B extends AbstractC<D>> {
    AbstractC<D> c;

    ConcreteA(B b) {
        c = b;
    }

    public D getD() {
        return c.getE();
    }
}

class AbstractC<E> {
    E e;

    AbstractC(E e) {
        this.e = e;
    }

    E getE() { return e; };
}

class D {

}

请注意,根据您的类定义, ConcreteAAbstractCD (!)是类,而B只是模板参数。 不要混淆了!

如果您也想将D作为模板参数,则必须在ConcreteA的类头中明确指定此参数:

public class ConcreteA<B extends AbstractC<D>, D> {
    AbstractC<D> c;

    ConcreteA(B b) {
        c = b;
    }

    public D getD() {
        return c.getE();
    }
}

class AbstractC<E> {
    E e;

    AbstractC(E e) {
        this.e = e;
    }

    E getE() { return e; };
}

现在, BD (和E )是模板参数。

实现几乎您要查找的内容的最常见技术是将您想要的类的Class<T>作为参数传递。

这是一个示例,但它不会以newInstance停止。 您可以在getT方法内的任何地方正常使用T

public class A<B extends Set<String>> {
  final B b;

  public A(B b) {
    this.b = b;
  }

  // Hard-coded - not the best.
  public String getString () {
    return "";
  }

  // Internally stored so type is retained.
  public B getB () {
    return b;
  }

  // Inferred from a parameter passed as a Class<T>.
  public <T> T getT(Class<T> clazz) throws InstantiationException, IllegalAccessException {
    return clazz.newInstance();
  }

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM