Java 将泛型类型转换为对象
我正在编写一个转换器,将Java 将泛型类型转换为对象,java,generics,transform,factory,Java,Generics,Transform,Factory,我正在编写一个转换器,将字符串输入转换为自定义类型的输出。下面是界面的样子: public interface Transformer<T> { public T transform(String input); } 在我的main课程中,我正在做以下工作: factory.getTransformer(foo, Integer.class).transform(input); 这将导致以下错误: Type mismatch: cannot convert from Cl
字符串
输入转换为自定义类型的输出。下面是界面的样子:
public interface Transformer<T> {
public T transform(String input);
}
在我的main
课程中,我正在做以下工作:
factory.getTransformer(foo, Integer.class).transform(input);
这将导致以下错误:
Type mismatch: cannot convert from Class<Integer> to Integer
类型不匹配:无法从类转换为整数
因此,我需要将类型
文本转换为对象
。在不修改接口和工厂的通用结构的情况下,有没有办法做到这一点?getTransformer(final SomeEnum enum,final T type)的签名
需要类型为T
的实际对象。您需要传递的是类的一个实例,因此它应该是:
getTransformer(最终SomeEnum枚举,最终类类型)
此外,由于Java8,因此不需要声明这样简单的接口。使用通用的函数
将为您提供完美的服务。getTransformer(final SomeEnum enum,final T type)的签名
需要类型为T的实际对象。您需要传递的是类的一个实例,因此它应该是:
getTransformer(最终SomeEnum枚举,最终类类型)
此外,由于Java8,因此不需要声明这样简单的接口。使用通用的功能将为您提供完美的服务。TL;DR:不要试图狙击@MAnouti你为他/她指定的观点。但为了完整起见,OP,我想分享我在中观察到的
“这会导致以下错误:”
…它修复了您在问题中报告的错误,和无法转换为Transformer
的错误,如果您只更改了类的参数,则会得到这些错误。DR
TL;DR:不要试图狙击您为他/她指定的@MAnouti点。但为了比较起见完整性,OP,我想分享我在
“这会导致以下错误:”
…它修复了您在问题中报告的错误,和如果您只将参数更改为类
时,无法转换为Transformer
错误,因为您不使用类型
参数,为什么需要它?参数应该是类类型
。这就是Integer.class
是什么:一个class
@MAnouti就是它,如果你能把它作为答案发布,我会接受。你不能用泛型来做这件事:你可以调用getTransformer(SomeEnum.FOO,Integer.valueOf(0))
和getTransformer(SomeEnum.FOO,Byte.valueOf(0))
-这两种类型都不可能是正确的。最好是从方法中返回一个Transformer
。@Steyrix这只是一个说明性的例子。我在实际实现中使用了类型,因为您没有使用类型
参数,为什么需要它?参数应该是类类型
。这就是为什么Integer.class
是一个class
@MAnouti就是这样,如果你能把它作为答案发布,我会接受。泛型不能这样做:你可以调用getTransformer(SomeEnum.FOO,Integer.valueOf(0))
和getTransformer(SomeEnum.FOO,Byte.valueOf(0))
-两者都不能是正确的类型。最好从方法返回一个转换器。@Steyrix这只是一个示例。我在实际实现中使用了该类型。那么,getTransformer(SomeEnum.FOO,Integer.class)
的类型是什么,以及getTransformer的类型是什么(SomeEnum.FOO,Byte.class)
?那么,getTransformer(SomeEnum.FOO,Integer.class)
的类型是什么,以及getTransformer(SomeEnum.FOO,Byte.class)的类型是什么
?你完全正确。我遇到了无法转换为Transformer
的错误,并尝试了一些解决方法,如使用通配符,扩展
关键字,但都不起作用。使用上述解决方案,我能够编写和执行代码。感谢全面的回答,我认为这比@MAnouti的回答。你完全正确。我得到了无法转换为Transformer
的错误,并尝试了使用通配符之类的解决方法,扩展
关键字,但都不起作用。使用上述解决方案,我能够编写和执行代码。感谢全面的回答,我认为这更复杂比@MAnouti的答案更简单。
Type mismatch: cannot convert from Class<Integer> to Integer
Type mismatch: cannot convert from Class<Integer> to Integer
...
incompatible types: IntegerTransformer cannot be converted to Transformer<T>
...
incompatible types: ByteTransformer cannot be converted to Transformer<T>
...
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!" );
}
}