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)));
}