将超类类型转换为子类类型?

时间:2015-06-08 22:38:38

标签: java oop casting

我知道有人问过这个问题,但是没有一个问题适合我的需要。对此感到抱歉。

无论如何,我的class AdvancedSocket extends java.net.Socket。在我的class AdvancedServerServer extends java.net.ServerSocket。因此,在AdvancedServerSocket中,我覆盖accept()方法以返回AdvancedSocket。这是方法:

@Override
public AdvancedSocket accept() throws IOException {
    return (AdvancedSocket) super.accept();
}

但这会引发java.lang.ClassCastException

3 个答案:

答案 0 :(得分:1)

当您致电super.accept()时,会执行SocketServer的{​​{1}}方法中的代码。该类对您定义的accept()类一无所知,因此无论它返回什么,它都不是AdvancedSocket的实例。

如果您想要返回AdvancedSocket,可以将调用返回的AdvancedSocket实例转移到Socket,并从中super.accept()生成AdvancedSocket

我希望有所帮助。

答案 1 :(得分:0)

实际上你的accept方法仍然返回普通的socket(因为你返回super.accept()),你怎么认为它可以被转换?您需要手动转换它(在通常的套接字上构建高级套接字)

答案 2 :(得分:0)

AdvancedServerSocket不是AdvancedSocket的类型,因此无法完成。

必须介于两者之间的某个位置,将它们视为合理,因此您应该能够创建一个interface来定义此功能,并且同时具有两个类implement。然后,您将能够以相同的通用方式处理它们。