java - 消除类型转换中的中间步骤

标签 java spring generics casting spring-data

我正在使用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;
  1. 有没有办法避免执行这个必要的中间步骤 这个 Actor 阵容?

  2. 第一次转换出现问题的原因是什么?

最佳答案

问题出在方法定义“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/

相关文章:

java.sql.SQLException : ORA-01036: illegal variable name/number

apache - 访问登录页面时创建了太多 session ?

c# - 如何将通用列表中同一接口(interface)的各种派生类作为参数传递给函数?

generics - 关于如何使用 multirec 的教程

java - 根据不同的单词数量查询不同的正则表达式字符串

java - 如何处理另一个类的对象

java - Spring 安全: Access is Denied Exception

java - 单元测试中的 Spring Boot 数据源

reactjs - 如何确定字符串是否是 Typescript 中的 keyof 接口(interface)?

java - BouncycaSTLe java 编码/解码。缺少字节?