我需要改进此代码:
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);
}
所以我决定实现一个类似Transformer的方法,它将类型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;
}
}
(String的例子 - &gt;整数)
现在,为了转换类型,我有另一个类Converters
,它包含一个表(带有两个键的Guava表),其中存储了所有转换器。
private final static ImmutableTable<Class<?>, Class<?>, Converter<?, ?>> converters;
并且方法为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)));
}
错误是
incompatible types: S cannot be converted to capture#1 of ?
在source.cast(value)
因为我用?
将它们存储在地图中所以我被卡住了。我不知道如何解决这个问题。我觉得这是不可能的,但是我发帖看看我是不是错了。
我在春季阅读this,但这是一种不同的方式
答案 0 :(得分:3)
您想要实现的目标是:
@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)));
}
但是,代码本质上不能保证类型安全。您必须保证放入Table
的3个元素是兼容的。