Java:在类型参数之间建立关联

Java:在类型参数之间建立关联,java,generics,type-parameter,Java,Generics,Type Parameter,假设我们有两个通用Java接口:Foo和Bar,其中可能有许多实现。现在,假设我们希望在单个类中存储每个类中的一个,这两个类都使用相同的T值,但保持键入确切的实现: public interface FooBar<T, TFoo extends Foo<T>, TBar extends Bar<T>> { TFoo getFoo(); TBar getBar(); } 公共接口FooBar{ TFoo getFoo(); TBar getBa

假设我们有两个通用Java接口:
Foo
Bar
,其中可能有许多实现。现在,假设我们希望在单个类中存储每个类中的一个,这两个类都使用相同的
T
值,但保持键入确切的实现:

public interface FooBar<T, TFoo extends Foo<T>, TBar extends Bar<T>> {
    TFoo getFoo();
    TBar getBar();
}
公共接口FooBar{
TFoo getFoo();
TBar getBar();
}
上面,
T
仅用于强制执行
TFoo
TBar
的类使用相同的类型参数。将此类型参数添加到
FooBar
似乎是多余的,原因有两个:

  • FooBar
    实际上根本不关心
    t
  • 即使是这样,
    T
    也可以从
    TFoo
    TBar
    中推断出来

  • 因此,我的问题是,是否有一种方法可以在不弄乱
    FooBar
    的类型参数列表的情况下强制执行这样的条件。必须编写
    FooBar
    而不是理论上等价的
    FooBar
    在我看来很难看。

    不幸的是,没有更好的方法。。。编译器需要声明T类型才能使用它,并且没有其他地方可以声明它:

    编辑:不相关链接

    如果未首先指定绑定A,则会出现编译时错误:

     class D <T extends B & A & C> { /* ... */ }  // compile-time error
    
    类D{/*…*/}//编译时错误 ()


    这有点离题,但将类型参数名称的约定定义为单个大写字母。

    作为旁注,我希望看到它们向Java添加类似于
    public interface FooBar{}
    的语法。我认为这是不可能的。不是因为
    T
    是通用的。伟大的问题+1类型推理的可能复制将解决这个问题。因此,一般化的问题是:例如,我们什么时候得到Scala中的类型推断?在Scala中,在使用站点可能根本不需要显式类型。至于你的评论,这是Scala的做法。如果您接受JVM上的其他语言来解决这个问题,我将发布一个示例。但当然,这并不能解决Java语言中的问题。虽然我不反对您提出的观点,但我想正式指出,链接文档似乎没有解决任何类似的问题。此外,您的引用是关于类和接口在边界中的顺序,而不是它们是否已声明。您是对的,链接文档主要不是用于主题的,因此引用的存在(编辑以使其更清晰)。是的,提到了排序,但是
    未首先指定
    和简单地
    未指定
    之间的区别是什么?文档试图理解的一点是,必须在extends语句中的接口之前指定类。这句话断章取义似乎很有意义,但在上下文中它与这个话题无关。哦,我的错!而且我似乎不能把我的手放在好的链接上。。。然而:)