为什么Java变量声明中的类型不同?
在Java变量声明的左侧和右侧指定不同类型的目的是什么?为什么Java变量声明中的类型不同?
例如,像这样的代码标准:
List<String> l = new ArrayList<>();
为什么不:
ArrayList<String> l = new ArrayList<>();
或
Object l = new ArrayList<>(); // Silly example but shows two extremes
- 这
List<String> l = new ArrayList<>();
允许初始化 所有的类型,无论是ArrayList
还是LInkedList
的String
。您可以使用List
的所有方法 -
ArrayList<String> l = new ArrayList<>();
您只能实例化String
的ArrayList
。 -
Object l = new ArrayList<>();
您不能使用List
方法。
@maba可怕的错误,我的歉意非常感谢:) –
当你这样做,你cannot use
列表操作像add()
,remove()
,addAll()
等
Object l = new ArrayList<>();
在这里,你正在失去多态性的灵活性:
ArrayList<String> l = new ArrayList<>();// later you could not re-initialize
l = new LinkedList<String>();//compile time error
总之
像这样的重新初始化可能会导致副作用和更多。恕我直言,这是不好的做法,做这样的事情。 –
@ B.Kemmer这是真的,但不是重点。应该考虑将实现更改为LinkedList,而不是重新初始化。如果您声明为ArrayList而不是List接口,那么这可能需要更多的代码更改。 –
@Adriaan Koster关键是列表
:抽象 – jamp
@RaulRene问题不在于这里的泛型... – jamp
我们总是可以使用'ArrayList l = ne w ArrayList ();'没有错。这只取决于你想如何使用它。另外'Object l = new ArrayList (); '根据用途也是正确的。 –
Blip