2015-04-23 100 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 –