Java 类型删除和重载?

标签 java generics spring-mvc overloading type-erasure

谁能简单解释一下为什么在下面的类中,当我传入一个String、Integer或UUID时,只使用以Object为参数的方法重载?

public final class SkuHydratingConverter implements Converter<Object, Sku> {
    @Autowired
    private SkuService skuService;


    /**
     * Default implementation, that errs as we don't know how to convert from
     * the source type.
     */
    public Sku convert(Object source) throws IllegalArgumentException {
        throw new IllegalArgumentException("Could not convert to Sku");
    }


    public Sku convert(String source) throws IllegalArgumentException {
        return convert(Integer.valueOf(source));
    }


    public Sku convert(Integer source) throws IllegalArgumentException {
        return skuService.get(source);
    }


    public Sku convert(UUID source) throws IllegalArgumentException {
        return skuService.get(source);
    }
}

最初我想实现 Converter<?, ?>一节课三次,但我很快发现这是不可能的。

最佳答案

重载机制在编译时起作用,即调用哪个方法是在编译类时决定的,而不是在运行程序时决定的。

由于(通常)在编译时无法知道运行时类型,所以像这样的片段

Object o = "some string";
method(o);

将导致调用方法,该方法将Object 作为参数,因为Objectcompile-time typeo 的。

(这与类型删除或泛型无关。)

关于Java 类型删除和重载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7511930/

相关文章:

java - Spring 3 MVC - 没有 Controller 的 JSP 页面的 View 解析器

java - 在运行时更改 JTable 引用 - 未出现在 GUI 中

java - 制作一个翻转的Android动画

java - 按引用对象与按值引用

java - 无法在浏览器上将 Spring Boot XSRF-TOKEN 标志设置为安全

java - 如何将代码转换为泛型方法 - Object.class

swift - 用于 nil 过滤的通用 Swift 字典扩展

c# - 使用引用类型与值类型参数化的泛型类型的隐式转换

java - 如何解决 - 创建名为 'defaultController' 的 bean 时出错

带有 Spring MVC 的 Springfox Swagger2 - 404 错误