繁体   English   中英

用Java返回Object []

[英]Return Object[] in Java

我需要返回整数和字节数组,我发现可以使用Object []返回它们,但是我不确定如何获取整数和字节数组。

它返回带有整数和字节数组的Object:

public static Object[] readVarInt(DataInputStream in) throws IOException {
    int i = 0;
    int j = 0;
    byte[] byteArr = null;
    byte b = 0;
    while (true) {
        int k = in.readByte();
        i |= (k & 0x7F) << j++ * 7;
        if (j > 5) {
            throw new RuntimeException("VarInt too big");
        }
        if ((k & 0x80) != 128) {
            break;
        }
        byteArr = Arrays.copyOf(byteArr, b);
        byteArr[b] = (byte) k;
        b+=1;
    }
    return new Object[] {i, byteArr}; // <<---
}

我不知道如何从Object []获取我的整数和字节数组:

Object Object;
Object = Protocol.readVarInt(serv_input);
int intLength = Object[0]; // <<---
byte[] byteArray = Object[1]; // <<---

这行不通,因为它认为它是数组,但是它是对象...

(很抱歉,我的知识不足,我是Java新手...)

您可以使用类型转换从Object[]获取数据

    int intLength = (int) result[0];
    byte[] byteArray = (byte[]) result[1];

但我建议使用包装对象而不是Object[]作为方法的结果:

class Result {
    private final int length;
    private final byte[] byteArr;

    Result(int length, byte[] byteArr) {
        this.length = length;
        this.byteArr = byteArr;
    }

    public int getLength() {
        return length;
    }

    public byte[] getByteArr() {
        return byteArr;
    }
}

public static Result  readVarInt(DataInputStream in) throws IOException {
    ...
    return new Result(i, byteArr);
}

....

Result result = readVarInt(serv_input);

int intLength = result.getLength();
byte[] byteArray = result.getByteArr();

还应注意,这部分byteArr = Arrays.copyOf(byteArr, b); 在执行的第一步中返回NPE,因为您试图从null复制数据。

您可以做的是使用instanceof测试您要访问的对象是否属于特定类,然后显式转换对象。

if (test[0] instanceof Integer) {
  intLength = (Integer) test[0];
} 
if (test[0] instanceof byte[]) {
  byteArray = (byte[]) test[0];
}

但是,我不建议这样做,因为我倾向于不将内容存储在Object中,因为您永远都不知道它们是哪个类。

也许您应该尝试将数据存储在Map中,该Map以您要计算的长度作为键,而将字节数组作为值。

Map<Integer, byte[]> result = new HashMap<>();
result.put(i, byteArray);

要注意的一件事是,映射的键不能是整数,而只能是整数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM