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) {
    
        }
    }