将泛型类型转换为对象

Convert Generic Types to Objects

我正在编写一个转换器来将 String 输入转换为自定义类型的输出。下面是 interface 的样子:

public interface Transformer<T> {
    public T transform(String input);
}

它会有多个实现(即IntegerTransformerByteTransformer等)。我已经写了一个 returns 这些变压器的工厂,例如:

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 class 中,我这样做:

factory.getTransformer(foo, Integer.class).transform(input);

这会导致以下错误:

Type mismatch: cannot convert from Class<Integer> to Integer

所以,我需要以某种方式将 Type 文字转换为 Object。有没有什么办法可以在不修改接口和工厂的通用结构的情况下做到这一点?

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

此外,自 Java8 以来,无需声明如此简单的接口。使用通用 Function<String,T> 将为您提供完美的服务。

TL;DR:不要试图狙击@MAnouti 你指定用于 him/her 的分数。但是为了完整起见,OP,我想分享我在 my attempt to reproduce your error.

中观察到的内容

This results in the following 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>
...

…请注意,这些与您在问题中报告的错误不同。

即使您确实听从了其他 answers/comments 的建议并将 T 替换为 Class<T>作为你方法的第二个形式参数,你仍然会得到上面的cannot be converted to Transformer<T>编译错误。

…Is there any way I can do that without modifying the generic structure of interface and factory?

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>.

的参数,您会得到错误