谁能简单解释一下为什么在下面的类中,当我传入一个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
作为参数,因为Object
是compile-time type。 o
的。
(这与类型删除或泛型无关。)
关于Java 类型删除和重载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7511930/