gpt4 book ai didi

java - 将一种类型转换为另一种类型

转载 作者:搜寻专家 更新时间:2023-11-01 03:03:03 25 4
gpt4 key购买 nike

我需要改进这段代码:

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

所以当我需要实现一个转换时我就实现这个接口(interface)

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

(字符串示例 -> 整数)

现在,为了转换类型,我有另一个类 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)

因为我用 ? 将它们存储在 map 中,所以我被卡住了。我不知道我该如何解决这个问题。我觉得这是不可能的,但我发帖是为了看看我是否错了。

我读了this在 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)));
}

但是,代码本身并不能保证类型安全。您必须保证放入 Table 的 3 个元素是兼容的。

关于java - 将一种类型转换为另一种类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31549452/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com