我的代码中有一个变换器接口,用于将一个对象转换为另一个对象,或者将一个List转换为另一个列表。
public interface Transformer {
<T, S> T transform(S source, Class<T> targetClazz, AfterPropertiesSetConverter<S, T> converter);
<T, S> List<T> transform(List<S> source, Class<T> targetClazz, AfterPropertiesSetConverter<S, T> converter);
}
实施:
public class DefaultTransformerImpl implements Transformer {
@Override
public <T, S> T transform(S source, Class<T> targetClazz,
AfterPropertiesSetConverter<S, T> converter) {
// use BeanCopier to copy object
// and use coverter object to do something else
}
@Override
public <T, S> List<T> transform(List<S> sources, Class<T> targetClazz,
AfterPropertiesSetConverter<S, T> converter) {
// do something
}
}
如果我像这样调用方法转换,
DefaultTransformerImpl.getInstance()
.transform(dto, PerformanceVO.class, PerformanceDTO2PerformanceVOConverter.getInstance());
PerformanceDTO2PerformanceVOConverter是接口Converter的实现。 java 6和java 7编译器告诉我这是通过的! 但如果我这样称呼这个方法,
DefaultTransformerImpl.getInstance().transform(resList,
SalesPlanVO.class, null)
因为如果我不需要在复制bean之后做一些事情,我将使用null而不是Converter的实现。 传递java 6编译器,但java 7有编译错误,
错误:对两种方法的引用都是模糊的 变换(S#1,类,AfterPropertiesSetConverter) 在DefaultTransformerImpl和方法中 变换(列表,类,AfterPropertiesSetConverter) 在DefaultTransformerImpl匹配[错误] T#1扩展了方法转换中声明的Object(S#1,Class,AfterPropertiesSetConverter) S#1扩展了在方法转换中声明的Object(S#1,Class,AfterPropertiesSetConverter) T#2扩展了方法转换中声明的Object(List,Class,AfterPropertiesSetConverter) S#2扩展了在方法转换中声明的Object(List,Class,AfterPropertiesSetConverter)
我不明白使用null和使用对象作为最后一个参数有什么区别。