通常,在创建对象时,前面提供了相同的类型 喜欢:
Scanner scanner = new Scanner(System.in);
但声明HashMap对象和TreeMap遵循不同的语法。
Map m1 = new HashMap();
SortedMap sm = new TreeMap();
是什么原因?我问我的教授。但他不知道答案。
答案 0 :(得分:5)
但声明HashMap对象和TreeMap遵循不同的语法。
你没有拥有。你可以写:
HashMap<String, Integer> map = new HashMap<String, Integer>();
......只是你通常不这样做。
同样,你可以写:
Object scanner = new Scanner(System.in);
基本上,涉及两种类型:
它们不必相同,但构造的类型必须与变量类型赋值兼容。它必须是类所支持的超类或接口。仅将Map
(或List
或其他)变量指定为接口类型的要点是,大多数代码只应将其视为map / list / set / whatever。事实上,它恰好是HashMap
(或ArrayList
等),是一个实现细节。
有关详细信息,请参阅"programming to an interface" ...但请注意语法在两种情况下均相同:
VariableType variableName = new ActualTypeBeingConstructed();
我问我的教授。但他不知道答案。
让我感到害怕......
答案 1 :(得分:2)
Map是一个接口(或更通用的类) - TreeMap是实现Map(或更具体的类)的东西。
e.g。 List是一个通用接口,ArrayList实现了List,所以你可以说
List<Obj> list = new ArrayList<Obj>();
// or
ArrayList<Obj> list = new ArrayList<Obj>();
// but not
ArrayList<Obj> list = new List...
如果你的教授真的不能回答这个问题,你真的需要一个新的教授!!
答案 2 :(得分:1)
SortedMap
是一个界面,因此您无法实现它。这就是为什么我们创建一个子类对象TreeMap
来实现这个接口并将其分配给接口对象SortedMap
,以便它可以使用子类和父类的类函数。
答案 3 :(得分:1)
您也可以声明
HashMap m1 = new HashMap();
TreeMap sm = new TreeMap();
Map是一个由HashMap(和TreeMap)实现的接口。您可以将实现Map接口的任何对象分配给作为映射decalared的变量。类似于Interface 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。