如何将List视为List的子类型
11 浏览
0 Comments

如何将List视为List的子类型

在阅读书籍《Java Generics and Collections》时,在使用通配符和super的部分,我遇到了一个例子。

public static  void copy(List dst, List src) {
  for (int i = 0; i < src.size(); i++) {
     dst.set(i, src.get(i));
  }
}

这个方法被这样调用:

Collections.copy(objs, ints);

上述调用是有效的,它的解释如下:

引用如下:

这个调用是允许的,因为objs的类型是List,它是List的子类型(因为ObjectNumber的超类型,符合通配符的要求),而ints的类型是List,它是List的子类型(因为IntegerNumber的子类型,符合extends通配符的要求)。

我对List如何成为List的子类型有疑问。

0
0 Comments

这个问题的出现是因为在解释中提到了"List是List的子类型"。然而,根据常规的理解,List应该是List的子类型,而不是List的子类型。所以,这个问题需要解释为什么List可以被认为是List的子类型。

问题的解决方法是将解释中的错误进行修正。正确的解释应该是List是List的子类型,而不是List的子类型。这样的修正可以消除对List和List之间的错误关系的误解。

以下是修正过后的解释:

也许你正在对这个描述进行研究。可以这样理解:List表示它应该是一个列表,可以存储任何对象,只要该对象是Number的超类。因此,List显然符合这个条件。但在解释中,它却说List是一个子类型。

修正后的解释:

也许你正在对这个描述进行研究。可以这样理解:List表示它应该是一个列表,可以存储任何对象,只要该对象是Number的超类。因此,List显然符合这个条件。但在解释中,它却说ListList的子类型。

这个问题的出现是因为在解释中提到了"List是List的子类型"。然而,根据常规的理解,List应该是List的子类型,而不是List的子类型。所以,这个问题需要解释为什么List可以被认为是List的子类型。

问题的解决方法是将解释中的错误进行修正。正确的解释应该是List是List的子类型,而不是List的子类型。这样的修正可以消除对List和List之间的错误关系的误解。

0
0 Comments

编译器如何理解这种行为?

编译器在处理泛型类型时会进行类型推断和类型检查,以确保类型安全。对于协变(covariant)和逆变(contravariant)的泛型类型,编译器会根据其定义进行推断和检查。

在Java中,使用通配符“? extends”表示协变,使用通配符“? super”表示逆变。协变表示一个类型是其子类型的一种特殊情况,而逆变表示一个类型是其超类型的一种特殊情况。

对于逆变的泛型类型,编译器会根据其定义来判断类型关系。例如,对于“List”这个泛型类型,可以将其理解为“List”或“List”的超类型。这是因为逆变允许将泛型类型的参数类型限制为指定类型或其超类型。

编译器会根据这个定义来推断和检查代码中的类型关系。例如,如果有一个方法接受“List”类型的参数,可以传递一个“List”或“List”类型的参数给该方法,因为这两者都是“List”的超类型。

因此,编译器可以通过逆变的定义来理解和支持这种行为。这样可以确保代码在类型安全的前提下能够正确运行。

编译器通过逆变的定义来理解和支持逆变泛型类型的行为。逆变允许泛型类型的参数类型为指定类型或其超类型。编译器会根据这个定义来推断和检查代码中的类型关系,从而确保代码在类型安全的前提下能够正确运行。

0
0 Comments

在这个问题中,出现了对于(How List is subtype of List)这个问题的原因以及解决方法的讨论。原因是因为对于类型子类的定义,即类型X是类型Y的子类型,当且仅当类型X的每个对象或原始类型也是类型Y的时候。所以问题就是是否每个类型为List的对象也是类型为List的对象。

现在,部分的代码"? super Number"的意思是"任何是Number的超类型的类型,包括Number本身"。只有两个这样的类型,Number和Object。

所以,List是一个抽象类型,其中包含List和List以及其他类型(当然还有这两个类型的子类型)。

但是List不能是List of Number的子类型,所以只剩下List

Number是的有效替代品吗?

它是一个有效的替代品,但是我对List参数感到困惑,它被说成是List的子类型(其中List可以是有效的超类,而不是List)。

List在技术上不是List的子类型,它们都是List。然而,List是List的一个有效替代品,因为Object是? super Number的有效替代品。

不。List绝对是List的子类型。

0