java - Eclipse 将此代码视为错误,但它在 Maven 中编译得很好

标签 java eclipse spring maven spring-data

我有一个使用 spring 框架的项目,我正在尝试创建一个 CrudController,Eclipse 指出我的代码有错误,但代码编译正常。

它在 UserController.java::5 上失败 -

Bound mismatch: The type UserService is not a valid substitute for the bounded parameter <S extends Service<M,CrudRepository<M,Long>>> of the type CrudController<M,S>

代码如下:

UserController.java(发生错误的地方)

package app;

import org.springframework.beans.factory.annotation.Autowired;

public class UserController extends CrudController<User, UserService>{

  @Autowired
  @Override
  public void setService(UserService service) {
    this.service = service;
  }

}

CrudController.java

package app;

import org.springframework.data.repository.CrudRepository;
import org.springframework.web.bind.annotation.ResponseBody;

public abstract class CrudController<M extends Model, S extends Service<M, CrudRepository<M,Long>>> {
  S service;
  public abstract void setService(S service);
  public @ResponseBody Iterable<M> getJson() {
    return service.getAll();
  }
}

模型.java

package app;

public class Model {

}

服务.java

package app;

import org.springframework.data.repository.CrudRepository;

public abstract class Service <M extends Model, R extends CrudRepository<M, Long>> {
  R repo;
  public abstract void setRepo(R repo);
  public Iterable<M> getAll() {
    return repo.findAll(); 
  }
}

用户.java

package app;

public class User extends Model {

}

用户库.java

package app;

import org.springframework.data.repository.CrudRepository;

public interface UserRepository extends CrudRepository<User, Long> {

}

用户服务.java

package app;

import org.springframework.beans.factory.annotation.Autowired;

public class UserService extends Service<User, UserRepository> {

  @Autowired
  @Override
  public void setRepo(UserRepository repo) {
    this.repo = repo;
  }

}

最佳答案

您的 CrudController 需要一个 Service 的子类,带有 CrudRepository

public abstract class CrudController<M extends Model, 
  S extends Service<M, CrudRepository<M,Long>>> { ..

但是你给它一个 Service 的子类和 CrudRepository 的子类。

您可以更改 CrudController 签名 ...

/* takes any CrudRepository */
public abstract class CrudController<M extends Model, 
  S extends Service<M, ? extends CrudRepository<M,Long>>> { ..

/* takes any CrudRepository */
public abstract class CrudController<M extends Model, 
  R extends CrudRepository<M, Long>, S extends Service<M,R>> { ..

/* you'll have to be explicit in UserController with this signature */
public class UserController extends CrudController<User, UserRepository, UserService>{

关于java - Eclipse 将此代码视为错误,但它在 Maven 中编译得很好,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28420391/

相关文章:

Spring RestTemplate - BufferingClientHttpRequestFactory & SimpleClientHttpRequestFactory

java - 启用csrf时,angularjs和spring security给出405错误

android - 在Android上实现Google Play服务登录

java - 从命令行通过 SSL 使用 Spring HttpInvoker

eclipse - DBeaver 内容辅助颜色

java - JBoss 标准输出未显示在 Eclipse 控制台 View 中

spring - Spring 事务是否通过新实例传播

java - 微服务之间的通信、共享实体或其他 hell

java - Guice如何将单例和非单例注入(inject)多线程

java - 在Java sql中添加多个Prepared Statement