【问题标题】:Can generics infer a related type?泛型可以推断出相关类型吗?
【发布时间】:2016-03-10 16:34:09
【问题描述】:

给定

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?

【问题讨论】:

  • 当您有这样的问题时,非常值得参考 JavaDoc。

标签: java generics


【解决方案1】:

有一个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();
}

但是,使用此构造,无法验证您的嵌套类是真正的类,在实现通用接口时声明。

【讨论】:

  • 谢谢,但我的问题不是我如何从 Class 获得 Class (这很简单),而是使用泛型,我如何指定一个返回对象的方法类型 Foo,如果模板只被告知 Foo.Bar。
  • @SarahPhillips 我编辑了我的答案,也许它可以给你一些提示。
猜你喜欢
  • 2022-01-07
  • 1970-01-01
  • 2013-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多