Java泛型,需要解释
有几个简单的测试用例类:Java泛型,需要解释,java,generics,Java,Generics,有几个简单的测试用例类: public interface ListCriteria<T> { // some stuff here } public class UserListCriteria implements ListCriteria<User> { // implementation } public interface Editor<T> { // sample method 1 List<T> listObject
public interface ListCriteria<T> {
// some stuff here
}
public class UserListCriteria implements ListCriteria<User> {
// implementation
}
public interface Editor<T> {
// sample method 1
List<T> listObjectsTest1(ListCriteria<T> criteria);
// sample method 2
<L extends ListCriteria<T>> List<T> listObjectsTest2(L criteria);
}
两种方法的实现都是错误的。问题是为什么。特别是对于后一种方法。
当然,我可以做
接口编辑器,这将解决问题,但我不想,我想理解为什么我不能在这里使用方法级泛型。您得到的错误与泛型无关,因为您使用接口强制之外的另一种类型实现方法
编辑器
界面定义
List<T> listObjectsTest1(ListCriteria<T> criteria);
您不应该将参数的类型与参数的泛型类型弄错。编辑器
界面强制执行列表标准
类型。ListCriteria
的泛型类型是T
,T
可以被子类绑定,例如实现ListCriteria
。这就是我所说的“错误与泛型无关”的意思
我猜你想要的是
public interface Editor<C, T extends ListCriteria<C>> {
List<C> listObjectsTest1(T criteria);
}
并不意味着您可以实现L
UserEditor
仍必须实现
public <L extends ListCriteria<User>> List<User> listObjectsTest2(L criteria) {
return null;
}
公共列表listObjectsTest2(L标准){
返回null;
}
此方法定义了当客户端调用该方法时将绑定的泛型类型L
。
因此,您可以使用属于ListCriteria
子类型的任何类型调用该方法
UserEditor
的listObjectsTest1(UserListCriteria)
函数没有覆盖Editor
接口的listObjectsTest1(ListCriteria)
,因为它们有两个不同的签名,即基本上是参数类型
界面中声明的listObjectsTest2
也是如此:listObjectsTest2(L标准)
但是您已经在UserEditor
类中将其声明为:List-listObjectsTest2(UserListCriteria-criteria)
因此,您需要将签名更改为:
class UserEditor implements Editor<User> {
@Override
public List<User> listObjectsTest1(ListCriteria<User> criteria) {
}
@Override
public <L extends ListCriteria<User>> List<User> listObjectsTest2(L criteria) {
}
}
类UserEditor实现编辑器{
@凌驾
公共列表listObjectsTest1(ListCriteria标准){
}
@凌驾
公共列表listObjectsTest2(L标准){
}
}
请通读以了解更多详细信息。谢谢,我是否正确地告诉您,我可以覆盖返回类型,但不能覆盖方法参数,并且我必须保留完全相同的arg签名,即使UserListCriteria
在运行时非常适合?
public class UserEditor implements Editor<User, UserListCriteria> {
public List<User> listObjectsTest1(UserListCriteria criteria) {
return null;
}
}
<L extends ListCriteria<T>> List<T> listObjectsTest2(L criteria);
public <L extends ListCriteria<User>> List<User> listObjectsTest2(L criteria) {
return null;
}
class UserEditor implements Editor<User> {
@Override
public List<User> listObjectsTest1(ListCriteria<User> criteria) {
}
@Override
public <L extends ListCriteria<User>> List<User> listObjectsTest2(L criteria) {
}
}