Java 将一种类型转换为另一种类型
我需要改进此代码:Java 将一种类型转换为另一种类型,java,generics,Java,Generics,我需要改进此代码: final String valueString = value.toString(); if (Path.class.isAssignableFrom(destinationType)) { fixedValues.put(key, Paths.get(valueString)); } /* ... as above, for other types ... */ { } else { fixedValues.put(key, valueString); } 因
final String valueString = value.toString();
if (Path.class.isAssignableFrom(destinationType)) {
fixedValues.put(key, Paths.get(valueString));
} /* ... as above, for other types ... */ {
} else {
fixedValues.put(key, valueString);
}
因此,我决定实现一个类似的转换器,它将一个类型X
转换为另一个类型Y
我创建了这个界面
public interface Converter<S, D> {
D convert(final S source);
Class<D> getDestinationClass();
Class<S> getSourceClass();
}
public class StringToIntegerConverter implements Converter<String, Integer> {
@Override
public Integer convert(final String source) {
return Integer.parseInt(source);
}
@Override
public Class<Integer> getDestinationClass() {
return Integer.class;
}
@Override
public Class<String> getSourceClass() {
return String.class;
}
}
并具有转换方法convert
public <S, D> D convert(final Class<S> source, final Class<D> destination, final S value) {
return destination.cast(converters.get(source, destination).convert(source.cast(value)));
}
在source.cast(值)
因为我用?
将它们存储在地图中,所以我被卡住了。我不知道该怎么解决这个问题。我觉得这是不可能的,但我发帖子是想看看我是否错了
我读的是Spring,但它是另一种方式,你试图实现的目标是可能的:
@SuppressWarnings("unchecked")
public <S, D> D convert(final Class<S> source, final Class<D> destination, final S value) {
final Converter<S, D> converter = (Converter) converters.get(source, destination);
return destination.cast(converter.convert(source.cast(value)));
}
@SuppressWarnings(“未选中”)
公共D转换(最终类源、最终类目标、最终S值){
最终转换器=(转换器)转换器。获取(源、目标);
返回destination.cast(converter.convert(source.cast(value));
}
但是,该代码的性质不能保证类型安全。您必须保证放入
表中的3个元素是兼容的。
哦,我理解您所做的。我没有想到类似的事情。现在它编译了。现在我测试它,谢谢,它会工作的,但是如果你弄乱了converters表,那么你会得到运行时ClassCastException。然后就可以了,因为这意味着创建实现的程序员没有实现这些方法。因为instace和表中充满了反射(读取getSourceClass/getDestinationClass)
incompatible types: S cannot be converted to capture#1 of ?
@SuppressWarnings("unchecked")
public <S, D> D convert(final Class<S> source, final Class<D> destination, final S value) {
final Converter<S, D> converter = (Converter) converters.get(source, destination);
return destination.cast(converter.convert(source.cast(value)));
}