From 6c5ce05c5d07d7f34f1f428b5d250d302226ce31 Mon Sep 17 00:00:00 2001 From: akwizgran Date: Fri, 5 Aug 2011 13:26:37 +0100 Subject: [PATCH] Promote integer types to the expected type to allow, for example, a list of mixed integer types to be read as a list of longs. --- .../net/sf/briar/serial/ReaderImpl.java | 21 ++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/components/net/sf/briar/serial/ReaderImpl.java b/components/net/sf/briar/serial/ReaderImpl.java index 3c7f82940..9638998a9 100644 --- a/components/net/sf/briar/serial/ReaderImpl.java +++ b/components/net/sf/briar/serial/ReaderImpl.java @@ -407,7 +407,26 @@ class ReaderImpl implements Reader { private T readObject(Class t) throws IOException { try { - return t.cast(readObject()); + Object o = readObject(); + // If this is a small integer type and we're expecting a larger + // integer type, promote before casting + if(o instanceof Byte) { + if(Short.class.isAssignableFrom(t)) + return t.cast(Short.valueOf((Byte) o)); + if(Integer.class.isAssignableFrom(t)) + return t.cast(Integer.valueOf((Byte) o)); + if(Long.class.isAssignableFrom(t)) + return t.cast(Long.valueOf((Byte) o)); + } else if(o instanceof Short) { + if(Integer.class.isAssignableFrom(t)) + return t.cast(Integer.valueOf((Short) o)); + if(Long.class.isAssignableFrom(t)) + return t.cast(Long.valueOf((Short) o)); + } else if(o instanceof Integer) { + if(Long.class.isAssignableFrom(t)) + return t.cast(Long.valueOf((Integer) o)); + } + return t.cast(o); } catch(ClassCastException e) { throw new FormatException(); }