在Java變量聲明的左側和右側指定不同類型的目的是什麼?爲什麼Java變量聲明中的類型不同?
例如,像這樣的代碼標準:
List<String> l = new ArrayList<>();
爲什麼不:
ArrayList<String> l = new ArrayList<>();
或
Object l = new ArrayList<>(); // Silly example but shows two extremes
在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