java - 将 Objective C 转换为 Java Android 的小问题

标签 java android objective-c constructor

我正在尝试将 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 初始化:

- (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 中的代码是否与 Objective C 中的代码执行相同的操作,因为现在我收到一个错误,内容为“默认情况下隐式 super 构造函数 RPCPacket() 未定义”构造函数。必须定义一个显式构造函数”。 有什么想法吗?

最佳答案

我不谈论 Objective-C,但我很确定你不会做同样的事情,因为 Java 代码不正确:

从错误消息(和名称)中,我认为您的 RPCPacket“方法”是一个构造函数。如果您希望每当有人使用带有适当参数的 new RPCPacket() 时调用它,那就没问题。

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

因此,您应该简单地将字段设置为适当的值,而不是尝试在该方法中创建新的 RPCPacket 对象。

关于java - 将 Objective C 转换为 Java Android 的小问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7228342/

相关文章:

java - 在Android Studio 2.3.3中查找组件树

java - 如何配置maven urlrewrite

android - 显示软键盘时隐藏 ImageView

android - 有没有办法让通知保持 Activity 状态,直到用户点击清除?

ios - 如何将操作连接到以编程方式创建的 UIbutton

objective-c - 以编程方式绑定(bind) NSTableView 列

java - 如何将 .gif 转换为 byte[][]?

java - 变量名与对象类型相同?

android - removeEventListener 不适用于 Firebase 数据库

objective-c - 将WKWebView嵌入YouTube