为什么lst.add(2)为ArrayList 给出编译错误而不是调用add(Long)方法?
问题描述:
有在ArrayList的2点覆盖的方法:为什么lst.add(2)为ArrayList <Long>给出编译错误而不是调用add(Long)方法?
公共布尔添加(E E)
公共无效加载(INT指数,E元件)
哪些一般规则,根据add(longArg)
无法打包并致电add(E e)
,给我编译错误(因此实际上禁止我从溢出呼叫到add(E e)
:
ArrayList<Long> lst = new ArrayList<>();
lst.add(2); // c.ERR, see below
// method add(int, Long) in the type ArrayList<Long>
// is not applicable for the arguments (int)
P.S. Eclipse(SE7)编译器。
答
因为您正在尝试添加integer
。如果您指示编译器把它看作是一个long
添加L
或l
到
ArrayList<Long> lst = new ArrayList<>();
lst.add(2L); // now it can be autoboxed
执行的Java中9的JShell数量:
jshell> ArrayList<Long> lst = new ArrayList<>();
lst ==> []
jshell> lst.add(2);
| Error:
| no suitable method found for add(int)
| method java.util.Collection.add(java.lang.Long) is not applicable
| (argument mismatch; int cannot be converted to java.lang.Long)
| method java.util.List.add(java.lang.Long) is not applicable
| (argument mismatch; int cannot be converted to java.lang.Long)
| method java.util.AbstractCollection.add(java.lang.Long) is not applicable
| (argument mismatch; int cannot be converted to java.lang.Long)
| method java.util.AbstractList.add(java.lang.Long) is not applicable
| (argument mismatch; int cannot be converted to java.lang.Long)
| method java.util.ArrayList.add(java.lang.Long) is not applicable
| (argument mismatch; int cannot be converted to java.lang.Long)
| lst.add(2);
| ^-----^
jshell> lst.add(2l);
$2 ==> true
答
当您使用泛型,你将不得不包括参考列表中正在进行的对象的类型。在这种情况下,您试图告诉ArrayList仅引用long或int或double等类型的值...
您需要声明将在泛型中引用的对象,方法是使用big D Double和Big I Integer和Big L Long,因为它们是对象类型。
我不太确定你是否可以将Long作为对象类型,但检查你的API并且你会看到。
希望此代码的工作:
ArrayList<Long> lst = new ArrayList<Long>();
因为它需要扩大和autoboxed增加,但它不会自动一举两得。 –
eclipse不是编译器 –
eclipse拥有自己的Java编译器实现,提供不同的错误信息,允许错误后继续编译.... –