【问题标题】:Cast class to subclass将类转换为子类
【发布时间】:2015-10-08 21:15:18
【问题描述】:

例如。我有一百个或更多类 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;

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

【问题讨论】:

  • 这不清楚。什么是isA1isA2 等?你到底想在这里做什么? (即为什么您需要以通用方式动态创建这数百个子类的实例?)
  • 一些抽象布尔函数,用于确定应该创建哪个子类对象。实际上在这种情况下并不重要。
  • 方式可能不通用。我只是寻找避免许多 set(get()) 语句的方法
  • 我将从平面文件中命名的类列表构建一个代码生成器。丑陋,是的,但如果这是一次性工作,最简单的方法......并使用代码生成器构建您的工厂类

标签: java class reflection casting


【解决方案1】:

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

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

【讨论】:

  • 感谢您的回答。我不是自己创造的;问题已更新。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-30
  • 2013-05-08
  • 1970-01-01
  • 1970-01-01
  • 2017-01-03
  • 1970-01-01
相关资源
最近更新 更多