gpt4 book ai didi

Java 泛型返回类型

转载 作者:行者123 更新时间:2023-12-01 19:41:47 25 4
gpt4 key购买 nike

现在我有一些相同的方法,例如:

default Byte readByte(InputStream stream) {
ByteBuffer bytes = ByteBuffer.allocate(Byte.BYTES);
bytes.order(ByteOrder.nativeOrder());
while (0 != bytes.remaining()) {
try {
bytes.put((byte)stream.read());
}
catch (Exception e) {
e.getStackTrace();
}
}
bytes.rewind();
return bytes.get();
}
...
default Short readShort(InputStream stream) {
ByteBuffer bytes = ByteBuffer.allocate(Short.BYTES);
bytes.order(ByteOrder.nativeOrder());
while (0 != bytes.remaining()) {
try {
bytes.put((byte)stream.read());
}
catch (Exception e) {
e.getStackTrace();
}
}
bytes.rewind();
return bytes.getShort();
}

对于 Integer、Float、Double 也是如此,我想如何才能使其更通用?

我尝试的,例如:

private <T extends Number> T read(InputStream stream) {
ByteBuffer bytes = ByteBuffer.allocate(T.BYTES);
bytes.order(ByteOrder.nativeOrder());
while (0 != bytes.remaining()) {
bytes.put((byte)stream.read());
}
bytes.rewind();
switch (T.class) {
case Byte.TYPE: return bytes.get();
case Short.TYPE: return bytes.getShort();
case Integer.TYPE: return bytes.getInt();
case Long.TYPE: return bytes.getLong();
case Float.TYPE: return bytes.getFloat();
case Double.TYPE: return bytes.getDouble();
default:
throw new UnsupportedTypeException(T.class);
}
}

所以,但它并没有像我想象的那样工作,Java != C++ 好吧.. 那么有什么方法可以以通用的方式做到这一点吗?

最佳答案

Java 中的泛型是编译时的,因此您不能使用它们来解决您的问题。我建议手动声明方法(getByte()getShort() 等),但在内部使用一些“通用”实现,如下例所示:

public Byte readByte(InputStream is) {
return read(is, Byte.BYTES, ByteBuffer::get);
}

public Short readShort(InputStream is) {
return read(is, Short.BYTES, ByteBuffer::getShort);
}

// And other methods...

private <T extends Number> T read(InputStream is, int length, Function<ByteBuffer, T> getter) {
ByteBuffer bytes = ByteBuffer.allocate(length);
bytes.order(ByteOrder.nativeOrder());
while (0 != bytes.remaining()) {
try {
bytes.put((byte)is.read());
}
catch (Exception e) {
e.getStackTrace();
}
}
bytes.rewind();
return getter.apply(bytes);
}

除此之外,我还想提一下,您似乎正在尝试重新实现 DataInputStream 。这是一个 InputStream 包装器,已经具有您需要的所有方法(readByte()readShort() 等)。

关于Java 泛型返回类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55145553/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com