通常,当您创建一个对象时,您会在前面提供相同的类型,例如:
Scanner scanner = new Scanner(System.in);
但是声明一个 HashMap 对象和 TreeMap 遵循这样不同的语法。
Map m1 = new HashMap();
SortedMap sm = new TreeMap();
是什么原因?我问我的教授。但他不知道答案。
但是声明一个 HashMap 对象和 TreeMap 遵循这样不同的语法。
你不必。你可以写:
HashMap<String, Integer> map = new HashMap<String, Integer>();
...只是你通常不会。
同样你可以写:
Object scanner = new Scanner(System.in);
基本上,涉及到两种类型:
它们不必相同,但构造的类型必须与变量类型的赋值兼容。它必须是该类支持的超类或接口。仅将一个Map
(或List
其他)变量指定为接口类型的意义在于,大多数代码只应将其视为 map/list/set/whatever。它恰好是一个HashMap
(或ArrayList
等)在幕后的事实是一个实现细节。
有关此的更多详细信息,请参阅“对接口编程” ...但请注意,两种情况下的语法是相同的:
VariableType variableName = new ActualTypeBeingConstructed();
我问我的教授。但他不知道答案。
这让我害怕...
Map 是一个接口(或更通用的类)- TreeMap 是实现 Map 的东西(或更具体的类)。
例如 List 是一个通用接口,ArrayList 实现 List 所以你可以说
List<Obj> list = new ArrayList<Obj>();
// or
ArrayList<Obj> list = new ArrayList<Obj>();
// but not
ArrayList<Obj> list = new List...
如果你的教授真的不能回答这个问题,你真的需要一个新的教授!
SortedMap
是一个接口,所以你不能实例化它。这就是为什么我们创建一个TreeMap
实现此接口的子类对象并将其分配给接口对象SortedMap
,以便它可以使用子类和父类的两个功能。
你也可以声明
HashMap m1 = new HashMap();
TreeMap sm = new TreeMap();
Map 是一个由 HashMap(和 TreeMap)实现的接口。您可以将实现 Map 接口的任何对象分配给声明为映射的变量。对于接口 TreeMap 也是如此。
在java中,你有一个类和接口的层次结构。一个类可以分配给它实现的任何接口的任何“父”类
一个更复杂的例子是 Swingclass JTextField 这里的层次结构是
Component
Containter
JContainer
JTextComponent
JTextField
所以
Component c1 = new JTextField();
Containter c2 = new JTextField();
JContainer c3 = new JTextField();
JTextComponent c4 = new JTextField();
都是完全有效的。JTextField 是一个 JTextCompent、JContainer、Container 和 Component。