【问题标题】:Confusion in generics in javajava中泛型的困惑
【发布时间】:2020-04-05 10:17:00
【问题描述】:

我正在学习java中的泛型。起初我们制作了一个整数数组列表,我们在列表中添加了一个值。

import java.util.ArrayList;
import java.util.List;

public class GenericsRunner {
    public static void main(String[] args) {
        ArrayList<Integer> numbers=new ArrayList<>();
        numbers.add(1);
    }

    static <X extends List> void duplicate(X list) {
        list.addAll(list);
    }
}

方法副本只能由扩展List 的对象使用。但是,由于List 是接口

public interface List<E> extends Collection<E> 

ArrayList 正在实现List

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

我在这一点上卡住了。 Extends 由那些从超类继承属性的类使用。 但是Arraylist 是如何扩展List 的呢?实际上ArrayList 正在实现List。这个 extends 关键字如何为这个实现机制工作?我很困惑它使用extendsimplements 是一样的吗?

【问题讨论】:

  • 您是否注意到它是 extends AbstractList 而不是 extends List
  • 是的,但它也在执行列表?
  • 是的,这可能只是做了多余的声明,但是AbstractList 已经实现了List,所以List&lt;E&gt; 在某种意义上可以从implements 接口中删除。

标签: java generics


【解决方案1】:

原因是&lt;X extends T&gt; 意味着X 继承自T。接口没有特殊的语法,比如在类声明中描述继承时。

ArrayList实现了接口List,即继承自List,因此适用于泛型&lt;X extends List&gt;

在 Java 中,任何类都可以只扩展一个类。默认情况下,当您不指定另一个父类时,它是Object。并且类和接口可以实现任意数量的接口。

希望这会有所帮助。

【讨论】:

  • 所以如果一个类实现了接口,我们可以这么说,它是被继承的吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-13
  • 2022-07-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多