假设我有
public interface General extends Serializable {
...
}
和
public class Specific implements General {
...
}
我可以通过ArrayList<Specific>
发送ObjectOutputStream
类型的对象并通过转换为List<General>
对其进行反序列化吗?那会有用吗?如果没有,我该怎么做?
答案 0 :(得分:0)
我自己没有尝试过,但我认为它会起作用 - 看看ArrayList.readObject()/writeObject()
。 writeObject()
将写Specific
个对象,readObject()
应该能够将它们作为Specific
的实例读回来,并且反序列化列表中的每个元素都是General
1}}引用,这样就可以了。
答案 1 :(得分:0)
ArrayList是Serializable,根据javadocs(许多Collection类都是,只要它们包含的对象是),只要泛型类型是可序列化的,序列化方面就可以了 - 你要序列化并回读一个对象是一个ArrayList
这是一个不确定的演员。一般来说,它被认为是不安全的。如果你有
List<Specific>
你将无法将其投射到
List<Generic>
它们在逻辑上是不一样的(即使它们确实是在运行时)。事实上,在程序中直接演员会有问题,因为这是有效的:
List<Specific> specific = ...;
List<Generic> generic = (List<Generic>) specific;
generic.add(new OtherImplExtendingGeneric());
specific.get(specific.length() -1).methodOnlyOnSpecific(); // Kersplode
但是你把它当作一个对象,你没有其他类型的引用,所以它会解决。它不会阻止你这样做。它将在技术上产生预期的结果。可能有理由,但它肯定会让我在代码审查中挑起眉毛。
为什么需要转换泛型类型?
答案 2 :(得分:0)
是的有效:
out.writeObject(list);
和
List<General> list = (List<General>)in.readObject();
泛型和“普通”数据类型之间的区别在于泛型只对编译器可见,而不是在运行时。这意味着具有泛型的强制转换不是100%安全的,因为在运行时List<A>
和List<B>
是相同的。
但如果您确定该列表是General
的列表,我认为此处没有问题。