鉴于
public class Foo {
public static class FooBuilder { ... }
}
我想在返回Foo的第三个类上编写一个方法,给定Foo.FooBuilder.class
即
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?
答案 0 :(得分:2)
有一种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();
}
但是,使用这个结构,没有办法验证它你的嵌套类是真正的类,在实现通用接口时声明。