byte[] m_RetByteArray = new byte[m_ByteArray.size()]; Byte[] m_Bytes=(Byte[])m_ByteArray.toArray(); for (int i = 0; i < m_ByteArray.size(); i++) m_RetByteArray[i] = (byte)m_Bytes[i]; return m_RetByteArray;
} 报错信息如下 Exception in thread "Thread-0" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.Byte; at NetShare.XNVarArray.GetBuffer(XNVarArray.java:469)
byte 和Byte是同一个东西吧,只是一个人的不同外号而已。
ArrayList等集合类里面只能装对象,不能存储基本数据类型。Byte是封装的对象,而byte是基本数据类型。所以ArrayLis<Byte> 是正确的。但是这样是可以的:byte a = 56;arrayList.add(a);自动装箱。
还是没回答实质问题Byte如何转为byte
ArrayList<Byte>m_Array=new ArrayList<Byte>; ....Byte[] m_Bytes=(Byte[])m_ByteArray.toArray();//这一步报错很奇怪 Exception in thread "Thread-0" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.Byte; at NetShare.XNVarArray.GetBuffer(XNVarArray.java:469)
Byte[] m_Bytes=(Byte[])m_ByteArray.toArray(); 这步有问题,报错信息“[Ljava.lang.Object; cannot be cast to [Ljava.lang.Byte;[Ljava.lang.Byte”,说明“Object”转“Byte”时出错。这样写试试: byte[] m_RetByteArray = new byte[m_ByteArray.size()]; for (int i = 0; i < m_ByteArray.size(); i++) m_RetByteArray[i] = (byte)m_ByteArray.get(i); return m_RetByteArray;
+1感觉java这点上面是比较坑。
楼主,错误的关键时红颜色部分。而不是你认为的Byte和byte之间的转换问题!
泛型不能为基本类型。其实没区别,你非要用byte的话。 ArrayList<Byte>m_Array=new ArrayList<Byte>; byte b = m_Array.byteValue();
楼主,错误的关键时红颜色部分。而不是你认为的Byte和byte之间的转换问题! 楼上说的很对,还有一句错了,改成下面这样就对了,LZ看看吧 ArrayList<Byte> m_ByteArray = new ArrayList<Byte>(); Object[] objs = m_ByteArray.toArray(); byte[] m_Bytes = new byte[objs.length]; for (int i = 0; i < m_Bytes.length; i++) { m_Bytes[i] = (Byte) objs[i]; }
上面各楼层已给出问题缘由,及红色语句中不能将Object[]强转成Byte[]。 我提供有助一个比较简便的方法将Object[]转为Byte[],至于之后是否转换为byte[],看楼主自己的需求。 将红色语句改为下面的代码,就不必用循环逐个遍历了: Byte[] m_Bytes= new Byte[m_ByteArray.size()]; System.out.println(m_ByteArray.toArray(m_Bytes));
ArrayList<Byte>能通过 ArrayList<byte>报错
所以使用ArrayList<Byte>
但在装为byte[]时出问题
其中m_ByteArray 为ArrayList<Byte>
public byte[] GetBuffer()
{
byte[] m_RetByteArray = new byte[m_ByteArray.size()];
Byte[] m_Bytes=(Byte[])m_ByteArray.toArray();
for (int i = 0; i < m_ByteArray.size(); i++)
m_RetByteArray[i] = (byte)m_Bytes[i];
return m_RetByteArray;
}
报错信息如下
Exception in thread "Thread-0" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.Byte;
at NetShare.XNVarArray.GetBuffer(XNVarArray.java:469)
....Byte[] m_Bytes=(Byte[])m_ByteArray.toArray();//这一步报错很奇怪
Exception in thread "Thread-0" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.Byte;
at NetShare.XNVarArray.GetBuffer(XNVarArray.java:469)
list.toArray完了是一个Object[]类型的,你现在是把Object[]类型转为Byte[]类型的报错,一直在纠结Byte如何转为byte这个问题干嘛?Byte.byteValue()就能够得到。
看看把Object[]类型转为Byte[]类型这个问题怎么解决?
多看看JDK文档吧! ClassCastException 一般来说父类是不能转化为子类的, 因为子类由父类继承而来,子类有的父类不一定有,所以出错. 能问问题是好的 多问是好事.但是基本问题还是要自己多看看书.
楼主
Byte[] m_Bytes=(Byte[])m_ByteArray.toArray();
toArray 方法返回来的是Object 类型。Object自然是不能转为byte的
Byte不能作为引用行类型
m_ByteArray.toArray();它的返回类型你知道是什么吗,返回的能强成Byte类型吗
这应该是你要解决的问题
byte[] m_RetByteArray = new byte[m_ByteArray.size()]; for (int i = 0; i < m_ByteArray.size(); i++)
m_RetByteArray[i] = (byte)m_ByteArray.get(i);
return m_RetByteArray;
+1感觉java这点上面是比较坑。
楼主,错误的关键时红颜色部分。而不是你认为的Byte和byte之间的转换问题!
ArrayList<Byte>m_Array=new ArrayList<Byte>;
byte b = m_Array.byteValue();
楼主,错误的关键时红颜色部分。而不是你认为的Byte和byte之间的转换问题!
楼上说的很对,还有一句错了,改成下面这样就对了,LZ看看吧
ArrayList<Byte> m_ByteArray = new ArrayList<Byte>();
Object[] objs = m_ByteArray.toArray();
byte[] m_Bytes = new byte[objs.length];
for (int i = 0; i < m_Bytes.length; i++) {
m_Bytes[i] = (Byte) objs[i];
}
我提供有助一个比较简便的方法将Object[]转为Byte[],至于之后是否转换为byte[],看楼主自己的需求。
将红色语句改为下面的代码,就不必用循环逐个遍历了: Byte[] m_Bytes= new Byte[m_ByteArray.size()];
System.out.println(m_ByteArray.toArray(m_Bytes));
第二个验证代码应该改为:
System.out.println(bs.length);
//或者是
System.out.println(Arrays.toString(bs));