2016-03-10 59 views
0

鉴于泛型是否可以推断出相关类型?

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

我想写一个返回美孚第三类中的方法,给出Foo.FooBuilder.class

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

是否有可能使用声明的签名泛型可以暗示返回类型?是否有一些语言功能可以让我说“类型U是类型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

当你有这样的问题时,很值得咨询JavaDoc。 –

回答

2

有一种Class#getDeclaringClass方法可以在你的情况下工作。 引用文档:

如果此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(); 
} 

然而,这种结构,没有办法验证它的嵌套类是真正的类,宣称实现通用接口的时候。

+0

谢谢,但我的问题不是如何从类(这是微不足道的)类但使用泛型,我如何指定一个方法返回一个Foo类型的对象,如果模板只告诉Foo.Bar 。 –

+0

@SarahPhillips我编辑了我的答案,也许它可以给你一些提示。 –