泛型可以推断相关类型吗?

时间:2016-03-10 16:34:10

标签: java generics

鉴于

public class Foo {
    public static class FooBuilder { ... }
}

我想在返回Foo的第三个类上编写一个方法,给定Foo.FooBuilder.class

Foo f = x.make(Foo.FooBuilder.class, someData);

是否可以使用可能暗示返回类型的泛型来声明签名?是否有一些语言功能让我说“U型是T型的外类”?

显然,可以指定类型扩展,或者是泛型类型(U extends TU super T的基础),但我正在寻找U outer T,这是我认为,不仅仅是Java可以提供,甚至可以间接提供,至少在1.7,我所针对的。

到目前为止,我已经简单地声明了内部和外部两种类型,但它的工作原理比我想要的更宽泛,并且看起来也很笨拙。

public <TYPE,BUILDER> TYPE make(Class<BUILDER> builderClass, Map<String,Object> data) {
    // Construct TYPE
}

有没有办法在不明确提供模板参数的情况下推断TYPE?

1 个答案:

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

但是,使用这个结构,没有办法验证它你的嵌套类是真正的类,在实现通用接口时声明。