繁体   English   中英

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

[英]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 TU 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM