java - 参数化类,如何引用作为参数化类型传递的参数化类型

标签 java generics

抱歉,如果标题很糟糕,我不确定如何提出这个问题...

假设我有一些带有参数的接口(interface) Foo

  public interface IFoo<Bar extends IBar>{

      public Bar generateBar();
  }

我还有另一个类,它接受一个 foo 对象并将生成一个 bar 对象。我可以这样定义它。

 public class FooBar<Bar extends IBar, Foo extends IFoo<Bar>>{

      private Foo foo;

      public FooBar(Foo foo){
          this.foo = foo;
      }

      public Bar getBar(){
           this.foo.generateBar();
      }

一切正常。但是,将 Bar 定义为我的 FooBar 类的参数对我来说似乎很愚蠢。 IFoo 对象将被参数化以获取 Bar 值,因此我假设我可以从 Foo 对象具有的任何参数推断出 Bar 的类型;从而避免有人在每次定义 FooBar 对象时都必须提供两个参数。

我有办法做到这一点吗?不是让 Bar 成为 FooBar 参数化类型的一部分只是从 Foo 的参数推断它?

编辑:答案似乎是无法完成,正如已经回答的那样。但是,我将把它留到另一天,因为我希望有人可以发布一个答案,不仅可以完成,而且为什么这是不可能的。具体来说,这只是一个 Java 开发人员从未选择支持的用例,还是有一个原因导致支持其他参数化检查的相同编译时类型检查无法通过查看特定的 IFoo 类型参数来推断 Bar 类型。编译器不能确定 IFoo 参数以及任何参数化类型吗?

最佳答案

如果您关心 IFoo 的实际类型参数,那么您所拥有的是正确的——声明类型参数 Bar 因此它可以是 IFoo 声明 Foo 时。

但是,如果您在代码中不关心 IFoo 的类型参数是什么,那么您可以消除 Bar 类型参数并将类型参数替换为IFoo 带有通配符绑定(bind)。

class FooBar<Foo extends IFoo<? extends IBar>>{

您的 getBar 方法需要返回一个 IBar

public IBar getBar(){
    return this.foo.generateBar();
}

关于java - 参数化类,如何引用作为参数化类型传递的参数化类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33264576/

相关文章:

用于ajax请求的Java服务器

java - 关于 Java 中通配符(泛型)的澄清

java - 数组无法分配给通用引用

java - 如何设置类名?

c++ - 如何从 C++ 中的函数返回一个 vector<T>

c# - 如何为给定类型创建实例?

java - jdbc中createStatement()是哪个类方法

java - GWT中的CellList,无法清除它

c# - for循环中可能发生的事情

java - 使用 JAX-RS 将两个查询参数合并到一个对象中