在Java中的泛型混淆问题

huangapple 未分类评论43阅读模式
英文:

Confusion in generics in java

问题

我正在学习Java中的泛型。首先,我们创建了一个整数的ArrayList,并向列表中添加了一个值。

  1. import java.util.ArrayList;
  2. import java.util.List;
  3. public class GenericsRunner {
  4. public static void main(String[] args) {
  5. ArrayList<Integer> numbers = new ArrayList<>();
  6. numbers.add(1);
  7. }
  8. static <X extends List> void duplicate(X list) {
  9. list.addAll(list);
  10. }
  11. }

方法duplicate只能被那些继承了List的对象使用。然而,由于List是一个接口:

  1. public interface List<E> extends Collection<E>

ArrayList实现了List

  1. public class ArrayList<E> extends AbstractList<E>
  2. implements List<E>, RandomAccess, Cloneable, java.io.Serializable

我在这一点上卡住了。extends关键字是用于那些从超类继承属性的类。但是ArrayList是如何扩展(extends)List的呢?实际上,ArrayList是实现(implements)了List。这个extends关键字是如何在这个实现机制中起作用的呢?我感到困惑,它是在使用extendsimplements时相同的吗?

英文:

I am learning generics in java.At first we made a arraylist of Integer and we added a value in list.

  1. import java.util.ArrayList;
  2. import java.util.List;
  3. public class GenericsRunner {
  4. public static void main(String[] args) {
  5. ArrayList&lt;Integer&gt; numbers=new ArrayList&lt;&gt;();
  6. numbers.add(1);
  7. }
  8. static &lt;X extends List&gt; void duplicate(X list) {
  9. list.addAll(list);
  10. }
  11. }

The Method duplicate can be only used by those objects which are extending List. But, since List is interface

  1. public interface List&lt;E&gt; extends Collection&lt;E&gt;

And ArrayList is implemeting List

  1. public class ArrayList&lt;E&gt; extends AbstractList&lt;E&gt;
  2. implements List&lt;E&gt;, RandomAccess, Cloneable,
  3. java.io.Serializable

I got stuck at this point. Extends is used by those classes which inherits the property from super class.
But how Arraylist is extending List? Actually ArrayList is implementing List. How is this extends keyword working for this implements mechanism? I am getting confused that it is using extends and implements are same?

答案1

得分: 1

原因是 &lt;X extends T&gt; 表示的仅仅是 X 是从 T 继承的。在类声明中描述继承时,并没有像在接口中那样特殊的语法。

ArrayList 实现了接口 List,这意味着它从 List 继承,因此适用于泛型类型 &lt;X extends List&gt;

在 Java 中,任何类只能继承 一个 类。默认情况下,当您不指定其他父类时,它继承自 Object 类。类和接口可以实现任意数量的接口。

希望这能有所帮助。

英文:

The reason is &lt;X extends T&gt; means just that X is inherited from T. There is no special syntax for interfaces like when you describe inheritance in class declaration.

ArrayList implements interface List which means that it is inherited from List, thus it is suitable for generic type &lt;X extends List&gt;.

In Java any class can extend only one class. By default it's Object when you do not specify another parent class. And class and interface can implement any amount of interfaces.

Hope this helps.

huangapple
  • 本文由 发表于 2020年4月5日 18:17:00
  • 转载请务必保留本文链接:https://java.coder-hub.com/61041048.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定