2

通常,当您创建一个对象时,您会在前面提供相同的类型,例如:

Scanner scanner = new Scanner(System.in);

但是声明一个 HashMap 对象和 TreeMap 遵循这样不同的语法。

Map m1 = new HashMap();
SortedMap sm = new TreeMap();

是什么原因?我问我的教授。但他不知道答案。

4

4 回答 4

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等)在幕后的事实是一个实现细节。

有关此的更多详细信息,请参阅“对接口编程” ...但请注意,两种情况下的语法是相同的:

VariableType variableName = new ActualTypeBeingConstructed();

我问我的教授。但他不知道答案。

这让我害怕...

于 2012-08-13T05:52:14.390 回答
2

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...

如果你的教授真的不能回答这个问题,你真的需要一个新的教授!

于 2012-08-13T05:49:16.147 回答
1

SortedMap是一个接口,所以你不能实例化它。这就是为什么我们创建一个TreeMap实现此接口的子类对象并将其分配给接口对象SortedMap,以便它可以使用子类和父类的两个功能。

于 2012-08-13T05:48:54.073 回答
1

你也可以声明

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。

于 2012-08-13T06:06:25.723 回答