我在创建对象时遇到了混乱,我在java docs和其他编程书籍中看到过。例如,
假设有base class
和derived class
1-我有一个Base
类型的变量,它引用Derived
类型的对象
List<String> list = new ArrayList<String>();
2-我有一个Derived
类型的变量,它引用Derived
类型的对象
ArrayList<String> arrList = new ArrayList<String>();
我的问题是在1和2之间选择时我的想法是什么?是否在一般的Base-Derived场景中利用Polymorphism
?
在我不知道的情况下选择1到2之间是否有better practice
,或者它只是personal decision
?
修改
抱歉,List是一个界面。 另一个问题:如果我使用Type参数,我的决定会改变吗?
ArrayList<T> list = new ArrayList<T>();
更新答案:这实际上称为"Programming to the interface"
。谢谢Code-Guru。在这个问题的一个答案中,我用非常简单的术语解释了我所寻找的正确内容 - What does it mean to "program to an interface"?
答案 0 :(得分:4)
List
不是基类,而是interface
,因此应该尽可能使用。
使用类实现的接口允许您使用实现接口的所有类,而不仅仅是特定的类。
String
是一个具体的类,所以直接使用它会更清楚。
但是,有时即使String
实现CharSequence
接口,也不必使用CharSequence
,因为它只会令人困惑。不过,请查看StringBuilder
,它几乎完全使用CharSequence
。
总结 - 没有更好只有适当的。
答案 1 :(得分:3)
选择基类型允许您在将来的某个时刻使用ArrayList来表示LinkedList,而无需更改其余代码。这为您以后的重构提供了更大的灵活性。同样,出于同样的原因,您的公共方法应返回List而不是特定类型的List实现 - 这样您就可以更改内部实现以优化性能而不会违反与调用者的合同。
答案 2 :(得分:1)
在List是一个类的情况下(假设是为了回答你的问题 - )我们应该使用表示子类的Parent类的对象还是使用类派生类的对象(actula类)?“< /强>
1)你是对的,它只是为了多态性的目的。
2)主要用于将对象传递给不同的类方法。其他类的方法可能是接受父类的输入。你必须在那些地方使用铸件。