将泛型类型转换为对象

问题描述

我正在编写一个转换器,将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。在不修改接口和工厂的通用结构的情况下,有什么方法可以做到?

解决方法

getTransformer(final SomeEnum enum,final T type)的签名需要类型为T的实际对象。您想要的是传递class的实例,因此它应该是: getTransformer(final SomeEnum enum,final Class<T> type)

此外,由于Java 8,因此无需声明这种简单的接口。使用通用的Function<String,T>将为您提供完美的服务。

,

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>

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...