[英]Can generics infer a related type?
给定
public class Foo {
public static class FooBuilder { ... }
}
给定Foo.FooBuilder.class,我想在返回Foo的第三个类上编写一个方法
即
Foo f = x.make(Foo.FooBuilder.class, someData);
是否可以使用暗示返回类型的泛型来声明签名? 有没有让我说“ U型是T型的外部类”的语言功能?
显然,可以指定类型是泛型类型的扩展,还是泛型的基础(分别是U extends T
或U super T
),但我正在寻找U outer T
,我认为这是Java所不能提供的。 ,甚至间接地至少在我定位的1.7中。
到目前为止,我只声明了内部和外部类型,虽然可以,但是比我后面定义的定义更广泛,看起来也很笨拙。
public <TYPE,BUILDER> TYPE make(Class<BUILDER> builderClass, Map<String,Object> data) {
// Construct TYPE
}
有没有一种方法可以在不显式提供模板参数的情况下推断TYPE?
在您的情况下,可以使用Class#getDeclaringClass
方法。 引用文档:
如果由此Class对象表示的类或接口是另一个类的成员,则返回表示在其中声明该类的类的Class对象。
编辑:
在澄清了OP之后,这是新的建议:
您创建一个通用接口来标记所有嵌套类:
public interface Nested<P> {
}
然后,将其应用于Foo.Bar
类,如下所示:
public class Foo {
public static class Bar implements Nested<Foo> {
}
}
然后在您的工厂中,您可以进行以下操作:
public <P> P make(Class<? extends Nested<P>> clazz, Map<String, Object> someData) {
// do whatever you need to do
return (P) clazz.getDeclaringClass();
}
但是,使用此构造,无法验证它,而您的嵌套类是在实现通用接口时声明的真实类。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.