将一种类型转换为另一种

时间:2015-07-21 20:56:03

标签: 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);
}

所以我决定实现一个类似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,但这是一种不同的方式

1 个答案:

答案 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个元素是兼容的。

相关问题