我有下面的代码片段,这很好.它不应该抛出编译时错误,因为我已经定义c了ArrayList哪个将包含String对象,但我正在添加Integer对象.那么为什么它没有抛出编译时/运行时错误?
Collection c = new ArrayList<String>();
c.add(123);
Run Code Online (Sandbox Code Playgroud)
我知道下面会抛出编译时错误,但为什么不在上面.这两个代码片段之间的逻辑区别是什么?
Collection<String>() c = new ArrayList();
c.add(123);
Run Code Online (Sandbox Code Playgroud)
第一个代码片段不会导致编译时错误,因为在该行
c.add(123)
Run Code Online (Sandbox Code Playgroud)
编译器检查c的类型.由于您将 c 声明为Collection,因此编译器会将其视为Collection.由于Collection提供了一个方法add(Object),因此add对c的任何对象都是完全合理的,尤其是整数.请注意,如果您尝试将集合值作为字符串回读,则此程序将导致运行时错误.
在第二个代码段中,您将提供有关编译器的更多信息.在这个片段中,它知道Collection它处理的是一个Collection<String>只能接受的片段Strings.因此,没有方法add(int)或add(Object)只有add(String).这会导致编译时错误.
| 归档时间: |
|
| 查看次数: |
130 次 |
| 最近记录: |