java - 将 ArrayList<> 对象传递给扩展 ArrayList 的类

标签 java arrays list generics arraylist

我正在尝试创建一个扩展 ArrayList 的类,添加下面定义的两个方法。 但是,新的 BetterArrayList 类无法正确从其构造函数方法读取参数,以从传递的 ArrayList<> 对象创建扩展对象。 将 ArrayList<> 对象传递给此类并将该对象的内容分配给类成员变量的正确方法是什么?

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


public class BetterArrayList<E> extends ArrayList<E> {
    private int size;
    private ArrayList<E> myArray = new ArrayList<>(size);

    public BetterArrayList(ArrayList<E> passArr){
        System.out.println("New BetterArrayList");
        this.size = passArr.toArray().length;
        this.myArray = passArr;
        myArray.addAll(passArr);    
    }
    public E pop() {
        return remove(this.size() - 1);
    }
    public void print() {
        myArray.forEach(elem ->{
            System.out.println(elem);
        });
    }
    /**
     * 
     */
    private static final long serialVersionUID = 1L;


    public static void main(String[] args) {
        // int[] ints = new int[] {1,2,3,4,5};
        Integer[] ints = new Integer[] {1,2,3,4,5};
        System.out.println(ints.length);
        ArrayList<Integer> arrs = new ArrayList<Integer>(Arrays.asList(ints));
        System.out.println(arrs.size());
        BetterArrayList<Integer> BetterArray = new BetterArrayList<Integer>(arrs);
        System.out.println(BetterArray.size());
        BetterArray.pop();
        BetterArray.print();
    }

}

最佳答案

尝试同时使用组合和继承会让您感到困惑。

简单地说,组合就是您尝试将 ArrayList 作为类字段放入并通过访问该字段来使用它。

继承是您尝试使用extends(在本例中)的地方。

我修改了您的代码以消除组合并简单地使用extends(我稍微更改了测试print语句以使其清晰):

public class BetterArrayList<E> extends ArrayList<E> {

    private static final long serialVersionUID = 1L;
    
    public BetterArrayList(ArrayList<E> passArr) {
        this.addAll(passArr);
    }
    
    public E pop() {
        return this.remove(this.size() - 1);
    }
    public void print() {
        this.forEach(elem ->{
            System.out.println(elem);
        });
    }

    public static void main(String[] args) {
        // int[] ints = new int[] {1,2,3,4,5};
        Integer[] ints = new Integer[] {1,2,3,4,5};
        
        ArrayList<Integer> arrs = new ArrayList<>(Arrays.asList(ints));
        BetterArrayList<Integer> betterArr = new BetterArrayList<>(arrs);
        
        System.out.println("ArrayList: " + arrs);
        System.out.println("BetterArrayList: " + betterArr);
    
        betterArr.pop();
        System.out.println("BetterArrayList After Pop: " + betterArr);
    }

}

输出:

ArrayList: [1, 2, 3, 4, 5]
BetterArrayList: [1, 2, 3, 4, 5]
BetterArrayList After Pop: [1, 2, 3, 4]

旁注:

我修改了您用于 BetterArrayList 实例的名称,以使用正确的 Java 命名约定,即 withCasingLikeThis 作为变量名称,而不是 CasingLikeThis .

此外,组合也可能是一种完全有效的方法,但尽量不要在同一个类上同时使用这两种方法。

区分它们的提示:

Composition represents a has a relationship.

Inheritance represents a is a relationship.

关于java - 将 ArrayList<> 对象传递给扩展 ArrayList 的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60328351/

相关文章:

java - 如何对复杂 TypeToken 的正确配置进行单元测试?

c# - 对大 N 应用 Rabin-Karp 哈希

Java VNC 库

c - 函数获取单词并将它们放入数组中

c - 使用列表存储 .txt 文件中的数据,仅存储最后一个输入 (C)

java - 如何确定一个点是否在二维凸多边形内?

php - 如何按嵌套在其中的元素对 PHP 数组进行排序?

php - 第 15 行的 fatal error : Allowed memory size of 67108864 bytes exhausted (tried to allocate 35 bytes) in/home/content/08/10674308/html/Arraytest. php

c - 一个Segfaulting Skip List,一个毁了的周末(C编程)

C#按时间同步2个不同类型的列表