我正在使用import org.springframework.data.repository.support.Repositories
在 Quartz 作业中获取 Spring Data Repository 的实例。
Repositories
类有一个 getRepositoryFor(Class<?> domainClass)
返回相应存储库实例的方法,但存储库的类型为 CrudRepository<Object, Serialiazable>
.
如果我尝试向上转换返回的 CrudRepository
自定义存储库类型 CustomerRepository
Eclipse 通知我无法执行转换。
// Eclipse Error: Cannot cast from CrudRepository<Object,Serializable>
// to CustomerRepository
this.customerRepository =
(CustomerRepository)super.repositories.getRepositoryFor(Customer.class);
但是,如果我将存储库分配给 CrudRepository<Customer, Long> repository
类型的字段然后我可以将其强制转换为 CustomerRepository
.
//No Problems here
CrudRepository<Customer, Long> repository =
super.repositories.getRepositoryFor(Customer.class);
CustomerRepository repository = (CustomerRepository) repository;
有没有办法避免执行这个必要的中间步骤 这个 Actor 阵容?
第一次转换出现问题的原因是什么?
最佳答案
问题出在方法定义“getRepositoryFor”中。它不会为“T”泛型建立契约,除非您将其分配给定义了泛型的变量。
public <T,S extends Serializable> CrudRepository<T,S> getRepositoryFor(Class<?> domainClass)
我猜编译器在那个级别看不到 CustomerRepository
延伸CrudRepository<Customer, Long>
。我认为这个例子将帮助您理解这个问题:
public class TestCast {
public static class MyMap extends HashMap<String, String> {
}
public static <T> Map<T,String> getMap1(Class<?> myClass) {
return new HashMap<T,String>();
}
public static <T> Map<T,String> getMap2(Class<T> myClass) {
return new HashMap<T,String>();
}
public static void main(String[] args) {
// Works, because it knows T is String as you state it with the variable type Map<STRING,String>
Map<String,String> map = getMap(String.class);
// Compilation error, it doesn't know T is String and cast won't work either
MyMap myMap = getMap1(String.class);
// Works, because it knows T is String as it is getting it in the method parameter, no need to rely on the variable that is getting the value
MyMap myMap = (MyMap) getMap2(String.class);
}
}
这是 Java 中的一个复杂领域,有一些已知的限制可以降低编译器的复杂性。
关于java - 消除类型转换中的中间步骤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16753892/