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

时间:2020-02-20 20:53:52

标签: 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();
    }

}

2 个答案:

答案 0 :(得分:2)

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

简单地说,撰写是您尝试将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

此外,合成也可以是一种完全有效的方法,但是请尽量不要在同一个类中同时使用它们。

提示以区分它们:

组成表示 具有 关系。

继承表示 关系。

答案 1 :(得分:0)

在构造函数方法中添加了super以自动创建带有作为参数传递的ArrayList <>对象的所有属性的新BetterArrayList <>对象。 似乎是一个简单的解决方法,我试图手动继承父类的属性,而不仅仅是调用super。

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

    public BetterArrayList(ArrayList<E> passArr){
        super(passArr);
        System.out.println("New BetterArrayList");
    }
    public E pop() {
        return remove(this.size() - 1);
    }
    public void print() {
        System.out.println(this);
    }
    /**
     * 
     */
    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.print();
        BetterArray.pop();
        BetterArray.print();
    }

}
相关问题