Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/371.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将泛型类型转换为对象_Java_Generics_Transform_Factory - Fatal编程技术网

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
的错误,如果您只更改了
类的参数,则会得到这些错误。DRTL;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!" );
    }
}