簡體   English   中英

Eclipse將此代碼視為錯誤,但它在maven中編譯良好

[英]Eclipse sees this code as error, but it compiles fine in maven

我有一個使用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();
  }
}

Model.java

package app;

public class Model {

}

Service.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(); 
  }
}

User.java

package app;

public class User extends Model {

}

UserRepository.java

package app;

import org.springframework.data.repository.CrudRepository;

public interface UserRepository extends CrudRepository<User, Long> {

}

UserService.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期待一個帶有CrudRepositoryService的子類,

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

但是你給它一個帶有CrudRepository子類的Service的子類。

你可以改變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>{

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM