我正在编写一个转换器,将s = Search()
s = s.filter('terms', status=['a', 'b', 'c'])
输入转换为自定义类型的输出。 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
。在不修改接口和工厂的通用结构的情况下,有什么方法可以做到?
答案 0 :(得分:1)
getTransformer(final SomeEnum enum, final T type)
的签名需要类型为T
的实际对象。您想要的是传递class
的实例,因此它应该是:
getTransformer(final SomeEnum enum, final Class<T> type)
此外,由于Java 8,因此无需声明这种简单的接口。使用通用的Function<String,T>
将为您提供完美的服务。
答案 1 :(得分:1)
TL; DR :不要试图抄袭@MAnouti为您指定的观点。但是为了完整起见,OP我想分享我在my attempt to reproduce your error中观察到的内容。
„ 这将导致以下错误:“
Type mismatch: cannot convert from Class<Integer> to Integer
问题中的原始示例代码无法编译(as confirmed by my failed attempt to reproduce the same error),并出现以下不同编译错误……
...
incompatible types: IntegerTransformer cannot be converted to Transformer<T>
...
incompatible types: ByteTransformer cannot be converted to Transformer<T>
...
…请注意,这些错误与您在问题中报告的错误不同。
即使您确实遵循了其他答案/评论的建议,也将 T
替换为 Class<T>
作为的第二个形式参数您的方法,仍然会出现上述 cannot be converted to Transformer<T>
编译错误。
„ ...有什么方法可以在不修改接口和工厂的通用结构的情况下做到这一点?”
我有confirmed by a simple experiment符合该条件。 并且 它可以成功编译并按预期运行...
public < T, U extends Transformer< T > > U getTransformer( SomeEnum eNum, Class< T > type ){
switch( eNum ){
case FOO:
return (U)new IntegerTransformer( );
case BAR:
return (U)new ByteTransformer( );
default:
throw new RuntimeException( "Detected Decepticons Among Us!" );
}
}
...它可以修复您在问题中报告的错误, 和 cannot be converted to Transformer<T>
错误,如果您唯一更改的是参数 Class<T>
。