我正在尝试将Objective C代码转换为Java,但是在理解如何实现方面存在一些问题。

这是Objective C代码:

+ (StPacket *)initialize:(UInt32)aPacketId packetType:(StPacketType)aPacketType operationType:(StOperationType)aOperationType
               objectOid:(NSString*)aObjectOid objectId:(UInt32)aObjectId dataSize:(UInt32)aDataSize dataHash:(NSString*)aDataHash
                dataType:(StPacketDataType)aDataType packetData:(NSData*)aPacketData {

    StPacket * packet = nil;

    switch (aPacketType)
    {
            // Special packets
        case ST_OBJECT_TYPE_INFO_START:
        {
            packet = [[StPacketInfoStart alloc] init];

            break;
        }
        case ST_OBJECT_TYPE_INFO_END:
        {
            packet = [[StPacketInfoEnd alloc] init];

            break;
        }
    }

    if (packet)
    {
        [packet setPacketData:aPacketId packetType:aPacketType operationType:aOperationType objectOid:aObjectOid objectId:aObjectId
                     dataSize:aDataSize dataHash:aDataHash dataType:aDataType packetData:aPacketData];
    }

    return [packet autorelease];
}


StPacketInfoStart init:

- (id)init {
    self = [super init];
    if (self)
    {
        locale = nil;
        serverApiVer = nil;
        deviceId = 0;
    }
    return self;
}


所以我是这样用Java实现的:

    public RPCPacket(   int apacketId,
                            RPCPacketType apacketType,
                            RPCOperationType aoperationType,
                            String[] aobjectOid,
                            int aobjectId,
                            int adataSize,
                            String[] adataHash,
                            RPCPacketDataType adataType){

            RPCPacket packet=null;

            switch(apacketType){
                case ST_OBJECT_TYPE_INFO_START:
                {
                    packet = new InfoStartRPCPacket();

                    break;
                }
                case ST_OBJECT_TYPE_INFO_END:
                {
                    packet = new InfoEndRPCPacket();

                    break;
                }
            }
packet = new RPCPacket(adataSize, apacketType, aoperationType, adataHash, adataSize, adataSize, adataHash, adataType);
    }


我的问题是,这是正确的方法,并且如果Java中的代码执行的功能与目标C中的功能相同,因为现在我遇到错误,即“对于默认构造函数,Implicit超级构造函数RPCPacket()未定义。必须定义一个显式构造函数”。
有任何想法吗?

最佳答案

我不会讲Objective-C,但是我可以肯定您不会做同样的事情,因为Java代码不正确:

从错误消息(和名称)中,我认为您的RPCPacket“方法”是构造函数。如果您希望每当有人将new RPCPacket()与适当的参数一起使用时调用它,就可以了。

但是在构造函数的最后,您*创建了一个新的RPCPacket对象,这几乎总是一个错误:构造函数运行时已经有一个新的RPCPacket对象。可以使用this(或隐式)访问它,并且需要使用该代码对其进行初始化。

因此,您不必尝试在该方法中创建新的RPCPacket对象,只需将字段设置为适当的值即可。

10-05 19:33