【发布时间】:2020-08-14 10:46:45
【问题描述】:
我正在编写一个转换器来将String 输入转换为自定义类型的输出。以下是interface 的样子:
public interface Transformer<T> {
public T transform(String input);
}
它将有多种实现(即IntegerTransformer、ByteTransformer 等)。我写了一个返回这些变压器的工厂,例如:
public class TransformerFactory {
public <T> Transformer<T> getTransformer(final SomeEnum enum, final T type) {
switch(enum) {
case FOO:
return new IntegerTransformer();
case BAR:
return new ByteTransformer();
default:
throw new Exception("blah");
}
}
}
在我的main 课堂上,我正在这样做:
factory.getTransformer(foo, Integer.class).transform(input);
这会导致以下错误:
Type mismatch: cannot convert from Class<Integer> to Integer
所以,我需要以某种方式将 Type 文字转换为 Object。有什么方法可以在不修改接口和工厂的通用结构的情况下做到这一点?
【问题讨论】:
-
既然不用
type参数,那为什么还要呢? -
参数应该是
Class<T> type。这就是Integer.class是:Class<Integer>。 -
@MAnouti 就是这样,如果您可以将其发布为答案,我会接受。
-
你不能用泛型做到这一点:你可以调用
getTransformer(SomeEnum.FOO, Integer.valueOf(0))和getTransformer(SomeEnum.FOO, Byte.valueOf(0))- 两者都不能是类型正确的。你能做的最好的就是从方法中返回一个Transformer<?>。 -
@Steyrix 这只是一个说明性示例。我确实在实际实现中使用了该类型
标签: java generics transform factory