23

我对 Java 有一点问题(作为 C++ 程序员)。

我有 2 个相关的课程:

public class Patient() {
...
}

public class PatientPersistent extends Patient {
...
    public void foo() {
    System.out.println(super.getClass().toString());
    }
}

这将输出:

类 org.example.smartgwt.server.model.PatientPersistent

有没有办法获取父类类型?IE

类 org.example.smartgwt.server.model.Patient。

这将允许我概括一些我需要在每个孩子身上实施的方法,这很糟糕。

谢谢!


更新

我正在使用 Dozer 将我的域 Hibernate 对象转换为可序列化的版本。我不希望客户知道这一点,所以客户只看到Patient类。在服务器端,我执行转换。

public class DataObject<Type> {

    private static final Class<Object> DstType = Type;

    public Object convert(Object srcData, final BeanFactory factory) {
        Mapper mapper = (Mapper)factory.getBean("dozerMapper");

        return (Object)mapper.map(srcData, DstType);
    }
}

public class Patient() implements Serializable {
    public Set foo;
}    

public class PatientPersistent extends Patient {

    public org.hibernate.collection.PersistentSet foo;
    DataObject<Patient> converter = new DataObject<Patient>;

    public Patient convertToSerializable(final BeanFactory factory) {
        return (Patient)converter.convert(this, factory);
    }
}

public class main() {
    // This object is not serializable so I cannot send it to the client
    PatientPersistent serializableBar = new PatientPersistent();

    // Using Dozer to copy the data PatientPersistent -> Patient
    // This will load the Dozer spring bean and copy as mapped
    Patient copiedSerializableData = serializableBar.convertToPersistent(bar, factory);
}

我知道这段代码不起作用,但这只是为了说明我的观点。我希望能够对象转换为可序列化的形式,以便可以将其发送回客户端。这就是为什么我想给出父母的类型。调用映射器总是一样的,一个源对象和一个 Dest.class。

也许我对java太困惑了。

谢谢

4

5 回答 5

43
getClass().getSuperclass()

但不要使用这个。这当然是糟糕设计的标志。

于 2010-07-20T21:53:55.523 回答
10

很好... super.getClass() 实际上是 Object 的 getClass(),它返回调用它的实例的运行时类型(在例中为 this)。因此,您会收到相同的课程...

与其使用 super 的实现来询问this的运行时类,不如询问 getClass 返回的类的超类:

getClass().getSuperclass()

顺便说一句,“这将允许我概括一些我需要在每个孩子身上实施的方法,这很糟糕。”是什么意思?你确定你没有其他设计选择吗?

于 2010-07-20T22:03:16.810 回答
6

Object.getClass()返回对象的运行时类型,因此super在调用之前并没有真正做太多。

你可以使用getClass().getSuperclass().

于 2010-07-20T21:54:27.720 回答
2

尝试:getClass().getSuperclass().toString()

于 2010-07-20T21:51:26.500 回答
1

我发现很多时候以您建议的方式用“魔术”解决问题会导致解决方案不太灵活。

如果你想获得你的超级类,你可能想要的是在你的父类中调用一个方法,该方法显式地实现你在查找父类的类型后要采取的任何行动。

此外,如果您当前实现的方法实际上是在您的父类中,并且该方法指的是在子类中实现的抽象方法,那么设计很有可能会更好——颠覆您的设计。

当然,我从你想要得到父类型的愿望中推断出这一切,可能是完全错误的,但我确实认为,如果知道你父母的班级是你正在寻找的答案,那么你问的是错误的问题——回爬上几英尺再看一遍。

于 2010-07-20T22:21:53.117 回答