Java:在类型参数之间建立关联
假设我们有两个通用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
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语句中的接口之前指定类。这句话断章取义似乎很有意义,但在上下文中它与这个话题无关。哦,我的错!而且我似乎不能把我的手放在好的链接上。。。然而:)