由于类型擦除,这不是直接可能的。其他答案中已经列出了几个选项。其中之一隐含地旨在分离转换。因此,您可以拥有两个不同的转换器,而不是拥有一个转换器:
public interface GenericConverter<T, U> {
U convert(T fromObject);
}
GenericConverter<Integer, String> forward = Converters.integerString();
GenericConverter<String, Integer> backward = Converters.stringInteger();
但请注意,GenericConverter
这种情况下的接口在结构上与Function
接口相同——因此可能没有理由创建新接口。
相反,如果您想将此“正向和反向转换器”作为某种命名实体(两个转换函数不可分割地链接在一起),您可以为此定义一个接口:
public interface GenericConverter<T, U> {
Function<T, U> forward();
Function<U, T> backward();
}
这可以按如下方式使用:
GenericConverter<Integer, String> converter = Converters.integerString();
String string = converter.forward().apply(someInteger);
Integer integer = converter.backward().apply(someString);
这是否是这里的“最佳”解决方案取决于预期的使用模式。一个优点可能是,使用像这样的通用(!)实用程序函数......
private static GenericConverter<T, U> create(
Function<T, U> forward, Function<U, T> backward) {
return new GenericConverter() {
@Override
public Function<T, U> forward() {
return forward;
}
@Override
public Function<U, T> backward() {
return backward;
}
}
}
创建一个新的转换器很容易:
public static GenericConverter<Integer, String> integerString() {
return create(
integer -> String.valueOf(integer),
string -> Integer.parseInt(string)
);
}