7

假设我们有两个通用 Java 接口:Foo<T>Bar<T>,其中可能有很多实现。现在,假设我们想要将其中的每一个存储在一个类中,两者都使用相同的值T,但保持输入的确切实现:

public interface FooBar<T, TFoo extends Foo<T>, TBar extends Bar<T>> {
    TFoo getFoo();
    TBar getBar();
}

上面,T仅用于强制执行TFooTBar的类使用相同的类型参数。添加此类型参数FooBar似乎是多余的,原因有两个:

  1. FooBar实际上根本不在乎T
  2. 即使确实如此,T也可以从TFoo和推断出来TBar

因此,我的问题是,是否有一种方法可以强制执行这样的条件,而不会弄乱FooBar的类型参数列表。不得不写FooBar<String, StringFoo, StringBar>而不是理论上等效的FooBar<StringFoo, StringBar>东西在我看来很难看。

4

1 回答 1

2

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

编辑:不相关的链接

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

 class D <T extends B & A & C> { /* ... */ }  // compile-time error

从这个文档中提取

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

于 2013-08-01T12:56:52.440 回答