将类转换为子类

时间:2015-07-19 18:58:26

标签: java class reflection casting

例如。我有一百个或更多的课程 A,B,C ... 无法更改。并从外部来源接收它们。这些类中的每一个都有子类 {A1,A2,... An},{B1},{C1,C2} ......我应该根据它的超类来创建它们。 但大多数超级只有一个 sub

我只能看到两种变体:

  1. 我为每个类层次结构创建了一百个工厂方法(或约束器)来获取子类。 类似的东西:

    public static <Sub extends A> Sub buildSubClass(A superc) { 
        Sub subclass;
        if(isA1(superc)) {
           subclass = new A1();
           subclass.setField(superc.getField())
           // etc for each field of A class
        } else if(isA2(superc)) {
           subclass = new A2();
           subclass.setField(superc.getField())
           // ....
        } // etc.
        return subclass;
    }
    
  2. 我可以使用反射

    public static <S, T> T castObject(S source, Class<T> targetClass) {
        T newInstance = targetClass.newInstance();
             for (Field field : source.getClass().getDeclaredFields()) {
                 for (Field fieldTarget : targetClass.getDeclaredFields()) {
                     if (isFieldsEqual(field, fieldTarget)) {
                         setField(getField(field, source), 
                    fieldTarget,  newInstance);
                     }
                 }
             }
             return newInstance;
      }
    
  3. 有java更优雅的方式将对象转换为子类对象吗?对我来说理想的方法就是改变对象签名,不要创建A子类的新实例,而是改变它,以便java将其视为子类对象的实例(带有新字段)。 类似的东西:

    A superc = new A(); 
    A1 sub = (A1) superc;
    

    我现在不行,但我想要这样的东西;

1 个答案:

答案 0 :(得分:0)

要将变量强制转换为子类,必须将变量实例化为该子类(或该子类的子类)。

use function A\test;
use const B\test;

ClassA a = new SubA();
SubA sub = (SubA) a;

,其中

ClassA a = new SubSubA();
SubA sub = (SubA) a;

检查您正在使用的对象是否可以转换为给定的类:

ClassA {...}
SubA extends ClassA{...}
SubSubA extends SubA{...}