首页 > 解决方案 > Java:泛型:从泛型方法获取对象类型 T 并访问其方法

问题描述

    public interface MyMapperInterface<Y, Z> {

    Y map(Z zObject);

    }

    public class One{
    }

    public class Two{
    }


    public MapperOneTwo  implements MyMapperInterface<One, Two> {

        public One map(Two twoObject){
            //Based on properties of Two, a new One Object is created and returned.
        }

    }


public MapperThreeFour  implements MyMapperInterface<Three, Four> {

        public One map(Two twoObject){
            //Now for two other class, Three and Four, there is a new 
              mapper.
              Based on properties of Two, a new One Object is created and 
               returned.
        }

    }





    FactoryClass

    public class Factory {

        public <T> T getClassInstance(String params){
          if (params.equals("a")) { 
    return (T) new MapperOneTwo();
    } else if (params.equals("b")){
    return (T) new MapperThreeFour();
    }
    }

    }

用法 我有一个处理程序类,它需要映射和传递另一种类型。所以我希望将类型传递给工厂,然后工厂提供相应的映射器,然后该映射器完成其工作并返回相应类型的对象。但问题是现在返回的对象是 Object 类型的,这个处理程序类必须在进一步传递它之前对其进行类型转换。

有没有办法避免类型转换并且仍然能够创建这样的工厂?

谢谢

标签: javagenerics

解决方案


因为编译器认为它是 Object 类类型

在运行时,Tis just Object,所以它与编译器无关。实际上,泛型主要是编译时的现象,所以编译器实际上知道泛型类型,但是由于类型擦除,这在运行时消失了。

标准工厂模式对接口使用编码,即它返回一个接口实例,其后面可能是特定的实现类型。所以这样的事情应该适合你:

public class Factory {
    public static MyInterface getClassInstance(String param) {
        switch (param) {
            case "a":
                return new MyClassA();
                break;

            case "b":
                return new MyClassB();
                break;

            default:
                return null;
        }
    }
}

然后,在您的代码中,您可以只使用 的实例MyInstance而不必担心实现。如果您的代码未设置为以这种方式使用该模式,您可能需要进行重构以便可以。


推荐阅读