Java 相同的擦除,但不是相同的类型。

Java 相同的擦除,但不是相同的类型。,java,generics,casting,erasure,Java,Generics,Casting,Erasure,如果我们首先了解Java中泛型的类型擦除意味着什么,那么就更容易理解为什么会发生这种情况。在继续之前,请查看Oracle文档 GenericExclusiveSelectionPanel transport = new GenericExclusiveSelectionPanel(StringConstants.TRANSPORT, (ArrayList<Object>)TransportManager.get

如果我们首先了解Java中泛型的类型擦除意味着什么,那么就更容易理解为什么会发生这种情况。在继续之前,请查看Oracle文档

GenericExclusiveSelectionPanel transport = 
                new GenericExclusiveSelectionPanel(StringConstants.TRANSPORT,
                    (ArrayList<Object>)TransportManager.getInstance().getTransportTypes());
现在,您已经知道了类型擦除的含义,让我们看看Oracle文档中的内容

GenericExclusiveSelectionPanel transport = 
                new GenericExclusiveSelectionPanel(StringConstants.TRANSPORT,
                    (ArrayList<Object>)TransportManager.getInstance().getTransportTypes());
从文档中可以清楚地看到,泛型的主要目标是提供更严格的编译时检查。如果编译器不使用泛型强制执行强制转换检查,这将是一个相当矛盾的问题。为了讨论,假设假设下列陈述是允许的:

GenericExclusiveSelectionPanel transport = 
                new GenericExclusiveSelectionPanel(StringConstants.TRANSPORT,
                    (ArrayList<Object>)TransportManager.getInstance().getTransportTypes());
List<String> strings = new ArrayList<String>();//1
strings.add("123");//2
List<Object> objects = strings;//3
objects.add(1);//4
List strings=new ArrayList()//1.
字符串。添加(“123”)//2.
列出对象=字符串//3.
增加(1)//4.
如果编译器没有在步骤3中限制赋值,则可以将
整数
添加到
字符串
对象列表中。如果编译器不抱怨第3步的赋值,从而允许我们继续第4步,那么泛型首先有什么好处

GenericExclusiveSelectionPanel transport = 
                new GenericExclusiveSelectionPanel(StringConstants.TRANSPORT,
                    (ArrayList<Object>)TransportManager.getInstance().getTransportTypes());

类似地,虽然
ArrayList
ArrayList
具有相同的擦除功能,但编译器对其赋值的抱怨是正确的,如上所述。总之,用泛型限制这些类型转换与限制具有相同擦除的构造函数/方法一样重要。

为什么您会期望一种类型可以被转换为另一种类型,仅仅因为它们具有相同的擦除?@LawrenceColes请阅读。是的,好问题+从我这里得到1。请看一下我的答案,如果您需要任何澄清,请告诉我
GenericExclusiveSelectionPanel transport = 
                new GenericExclusiveSelectionPanel(StringConstants.TRANSPORT,
                    (ArrayList<Object>)TransportManager.getInstance().getTransportTypes());