Zoe*_*oeH 2 java inheritance implementation
自从我开始学习泛型以来,我对实例创建有点困惑,因为我意识到例如,你可以像这样创建一个HashMap,
HashMap hashmap = new HashMap();
Run Code Online (Sandbox Code Playgroud)
但是也,
HashMap<String,String> hashmap = new HashMap<String, String>();
Run Code Online (Sandbox Code Playgroud)
虽然我也可以像这样声明实例hashmap,因为HashMap是从Map Interface实现的
Map<String,String> hashmap = new HashMap<String, String>();
Run Code Online (Sandbox Code Playgroud)
但如果以上是真的,那么我也可以用这种方式创建ArrayList的实例,是不是?
List<String> arraylist = new ArrayList<String>();
Run Code Online (Sandbox Code Playgroud)
而且,如何定制自定义,让我们说类Walk从接口Move实现,所以创建一个Walk的实例对象我可以使用这两个代码,
Walk walk = new Walk();
Move walk = new Walk();
Run Code Online (Sandbox Code Playgroud)
而这些不会引起问题,这两个声明是否相同?实现是启用该功能的关键功能,而类是如何从另一个扩展到类,父类扩展,这是合法的吗?
Father son = new Son();
Run Code Online (Sandbox Code Playgroud)
好的,这是很多问题和讨论的内容,但我会看到我能在一个简短的答案中涵盖多少.
让我们从在声明中使用泛型而不是不使用泛型的理由开始.
采取以下两个声明;
HashMap hashmap = new HashMap();
HashMap<String,String> hashmap = new HashMap<String, String>();
Run Code Online (Sandbox Code Playgroud)
第一个将接受任何键/值组合,您必须手动使用instanceof和转换才能从地图中获取对象,因为无法保证它将包含您认为它所执行的对象类型.
第二个在声明和ENSURES中使用泛型,只有 String键和值将HashMap在编译时进入您的实例.此外,当您通话时get(),您将String自动返回一个对象,而不必自行检查和投射.除非你有充分的理由,否则你应该总是在声明中使用泛型.
现在在声明你的集合时加入多态.采取以下两个例子;
List<String> sl = new ArrayList<String>();
ArrayList<String> sl2 = new ArrayList<String>();
Run Code Online (Sandbox Code Playgroud)
第一个更灵活,可以保存List任何方法决定返回的任何自定义子类.这意味着诸如get()可能返回的结果略有不同,具体取决于List它包含的子类,或者List可能以不同的顺序保留其中的项等.想一想.这为您提供了更大的灵活性,但确定性更低.
如果你绝对想要确保你List是一个ArrayList并且变量的方法总是按照ArrayList(并且将始终使用插入顺序)的方式行动,那么使用第二个例子.否则,如果您想在List类型中允许一些灵活性(例如,如果您希望它能够采用一些有序的AND排序列表),请使用第一个.
我希望这会有所帮助,我希望我不会错过任何太重要的事情.
以下是一些可以从官方Java教程中进一步阅读的链接;