2015-04-23 116 views
0

在Java變量聲明的左側和右側指定不同類型的目的是什麼?爲什麼Java變量聲明中的類型不同?

例如,像這樣的代碼標準:

List<String> l = new ArrayList<>(); 

爲什麼不:

ArrayList<String> l = new ArrayList<>(); 

Object l = new ArrayList<>(); // Silly example but shows two extremes 
+0

:抽象 – jamp

+0

@RaulRene問題不在於這裏的泛型... – jamp

+1

我們總是可以使用'ArrayList l = ne w ArrayList <>();'沒有錯。這隻取決於你想如何使用它。另外'Object l = new ArrayList <>(); '根據用途也是正確的。 – Blip

回答

1
  • List<String> l = new ArrayList<>();允許初始化 所有的類型,無論是ArrayList還是LInkedListString。您可以使用List的所有方法
  • ArrayList<String> l = new ArrayList<>();您只能實例化StringArrayList
  • Object l = new ArrayList<>();您不能使用List方法。
+0

@maba可怕的錯誤,我的歉意非常感謝:) –

1

當你這樣做,你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 
總之
+0

像這樣的重新初始化可能會導致副作用和更多。恕我直言,這是不好的做法,做這樣的事情。 –

+0

@ B.Kemmer這是真的,但不是重點。應該考慮將實現更改爲LinkedList,而不是重新初始化。如果您聲明爲ArrayList而不是List接口,那麼這可能需要更多的代碼更改。 –

+0

@Adriaan Koster關鍵是列表確實防止了很多麻煩。例如,將單元測試添加到您的代碼中會更容易。請查看此文章以獲取更多信息http://www.javaworld.com/article/2073649/core-java/why-extends-is-evil.html –

相關問題