Java:如何强制向上投射?

Java:如何强制向上投射?,java,kryo,kryonet,Java,Kryo,Kryonet,我使用Kryo库在Java中进行序列化。我有一个问题,我没有办法强迫上抛。以下是一个示例情况: class A {} class B extends A {} public save() { Kryo kryo = new Kryo(); kryo.setRegistrationRequired(true); //force registration kryo.register(A.class); //register A with kryo Output ou

我使用Kryo库在Java中进行序列化。我有一个问题,我没有办法强迫上抛。以下是一个示例情况:

class A {}
class B extends A {}

public save() {
    Kryo kryo = new Kryo();
    kryo.setRegistrationRequired(true); //force registration
    kryo.register(A.class); //register A with kryo
    Output output = new Output( ... );

    B bar = new B();
    kryo.writeObject(output, (A) bar); //try to cast it up
}
这会导致
类未注册
错误,因为
bar
仍然是
B
的实例


有没有办法强制将
bar
强制转换为
A
的一个实例,或者我需要执行类似
新的A(bar)
的操作?

您实际上不能这样做,因为正如您所述,强制转换不会改变对象仍然是B的一个实例的事实,不是A。您需要委托B的复合实例,并按照建议将其传递给构造函数。

向上转换不会更改对象本身,只会更改指向它的引用类型。你必须注册
B.class。

我想你的意思是说“因为bar仍然是B的一个实例”。你已经注册了
A.class
,所以看起来你应该序列化
A的一个实例。或者,如果注册
B.class
。您似乎对upcast对实例的引用而不是实例本身起作用这一事实感到困惑。它不接受
B
的实例,也不产生
A
的实例。是的,很抱歉。我不小心没有从我的代码中删除它,我现在已经更改了它,所以它是有意义的。不用担心,我看到了。我只是改变了我的答案:)