[英]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 {
}
请注意,根据您的类定义, ConcreteA
, AbstractC
和D
(!)是类,而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; };
}
现在, B
和D
(和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.