gpt4 book ai didi

java - 使用和不使用泛型创建 set/list/map 的实例有多少种合法方法

转载 作者:行者123 更新时间:2023-12-03 21:44:09 26 4
gpt4 key购买 nike

自从我开始学习泛型以来,我对实例创建有点困惑,因为我意识到,例如,你可以像这样创建一个 HashMap,

HashMap hashmap = new HashMap();

还有,

HashMap<String,String> hashmap = new HashMap<String, String>();

虽然我也可以像这样声明实例 hashmap,因为 HashMap 是从 Map 接口(interface)实现的

Map<String,String> hashmap = new HashMap<String, String>();

但是如果上面是真的,那么我也可以通过这种方式创建 ArrayList 的实例,对吗?

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

而且,自定义定义的怎么样,假设类 Walk 从接口(interface) Move 实现,以便创建 Walk 的实例对象我可以使用类似的代码,

Walk walk = new Walk();
Move walk = new Walk();

而且这些不会出问题,这两个声明是一样的吗?实现是启用该功能的关键功能,而从另一个类扩展的类又如何,例如,类 Son 从类 Father 扩展,那么这个合法吗?

Father son = new Son(); 

最佳答案

好吧,有很多问题和话题要谈,但我会看看我能在一个简短的回答中涵盖多少。

集合声明中的泛型。

让我们从在声明中使用泛型而不是不使用泛型的原因开始。

采取以下两个声明;

HashMap hashmap = new HashMap();
HashMap<String,String> hashmap = new HashMap<String, String>();

第一个将接受任何键/值组合,您将不得不手动使用 instanceof 和转换从 map 中获取对象,因为不能保证它会包含您认为的对象类型确实如此。

第二个在声明中使用泛型,确保 只有 String 键和值会进入您的HashMap 编译时的实例。此外,当您调用 get() 时,您将自动返回一个 String 对象,而不必自己检查和转换它。除非你有充分的理由,否则你应该始终在你的声明中使用泛型。

集合声明中的多态性。

现在在声明集合时介绍多态性。举以下两个例子;

List<String> sl = new ArrayList<String>();
ArrayList<String> sl2 = new ArrayList<String>();

第一个更灵活,可以包含任何方法决定返回的任何自定义 List 子类。这意味着 get() 等方法可能会返回略有不同的结果,具体取决于它包含的 List 子类,或者 List 中的项目可能以不同的顺序保存。想一想。这为您提供了更大的灵 active ,但确定性却大大降低。

如果你绝对想确保你的 List 是一个 ArrayList 并且变量的方法将始终按照 ArrayList 行事(并将始终使用插入顺序),然​​后使用第二个示例。否则,如果您想在 List 类型中允许一些灵 active (例如,如果您希望它能够采用一些有序和排序的列表),请使用第一个。

我希望这对您有所帮助,我希望我没有错过任何太重要的事情。

这里有一些链接可以进一步阅读官方 Java 教程;

关于java - 使用和不使用泛型创建 set/list/map 的实例有多少种合法方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24434788/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com