当前位置: 代码迷 >> java >> 将类转换为子类
  详细解决方案

将类转换为子类

热度:57   发布时间:2023-07-31 12:06:51.0

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

我只能看到两个变体:

  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; } 

有Java更优雅的方式将对象转换为子类对象吗? 对我而言,理想的方法是更改??对象签名,而不是创建A子类的新实例,而是对其进行更改,以便Java将其视为子类对象(具有新字段)的实例。 就像是:

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

我现在不起作用,但是我想要这种方式。

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

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

要么

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

哪里

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

要检查您使用的对象是否可以强制转换为给定的类:

if (a instanceof SubA) {
    //safe cast
    SubA sub = (SubA) a;
}
  相关解决方案