绑定到扩展T<;的类型的Java泛型类;E>;
我有一个泛型测试类,它在它测试的集合(在我的例子中是堆栈)的类型上是泛型的 让泛型类型的名称为绑定到扩展T<;的类型的Java泛型类;E>;,java,generics,interface,Java,Generics,Interface,我有一个泛型测试类,它在它测试的集合(在我的例子中是堆栈)的类型上是泛型的 让泛型类型的名称为S(对于堆栈)。我有一个接口IStack,我想要求S来实现IStack。 当我宣布我的班级为 类测试{…}, 我得到一个警告: IStack是原始类型,引用。。。应该参数化 类测试导致语法错误 标记“上的语法错误我认为您需要两个通用参数,一个用于元素,另一个用于堆栈类型,即 class Test<E,S extends IStack<E>> 类测试 (或者如果需要,E扩展元素
S
(对于堆栈)。我有一个接口IStack
,我想要求S
来实现IStack
。
当我宣布我的班级为
类测试{…}
,
我得到一个警告:
IStack是原始类型,引用。。。应该参数化
类测试
导致语法错误
标记“上的语法错误我认为您需要两个通用参数,一个用于元素,另一个用于堆栈类型,即
class Test<E,S extends IStack<E>>
类测试
(或者如果需要,E扩展元素的某些存储)类测试
使用IStack
,没有IStack
内部的编译时信息
您可以做的事情很少,完全取决于您的设计:
class Testclass TestIfE
已绑定,您需要class Test
。如果E
未绑定,则class test这听起来可能有些轻率,但我使用的测试框架会将其声明为class test
,没有类型参数。Java泛型没有按照大多数人期望的方式工作,也不可重新定义,因此,尝试以这种方式参数化类没有实际价值代码>我得到错误“类型S不是泛型的;它不能用参数参数化”。有没有办法做到这一点“给我一些堆栈实现,不管它是什么显式堆栈,我都会测试它?”事情?@Anton你的C#背景很明显;)但在Java中,它的工作方式不同。您需要:1)将Supplier
的实例传递给构造函数(例如SomeStack::new
)并调用Supplier.get()
,或者:2)传递Class
(例如SomeStack.Class
)的实例并调用stackClass.newInstance()
。