超类或泛型

Superclass or Generic Type

我需要能够理解哪种方法(下面列出)在 Java 环境中使用更有益。

因此我的问题是:我正在创建一个 class,我将在其中保存多个相同类型的对象,但是如果我将来想使用它,我想成为能够将不同的对象传递给 Array2D 的不同实例。它的名称是 Array2D,包含名为 rowscolumns 的私有实例变量。但是,我想要做的是能够将任何对象(当你实例化它时)传递给这个 class 并且能够 return 与 Array2D 内部的方法相同的类型。

方法一
使用泛型类型创建 Array2D。 https://docs.oracle.com/javase/tutorial/java/generics/types.html

方法二
创建一个可以扩展的 superclass 直接传递给 Array2D.

方法 1 的示例:

public class Array2D<T> {
    private int rows;
    private int columns;
    private T[] t;

    public Array2D(int rows, int columns) {
        this.rows = rows;
        this.columns = columns;
    }

    public T[] returnSomething() {
        return t;
    }
}

方法 2 的示例:

Arrayable.java

public class Arrayable {
    //all of my variables for arrayable class
}

Example.java

public class Example extends Arrayable {
    //more stuff
}

Array2D.java

public class Array2D {
    private int rows;
    private int columns;
    private Arrayable[] arrayable;

    public Array2D(Arrayable[] arr) {
        this.arrayable = arr;
    }

    public Arrayable[] returnSomething() {
        return arrayable;
    }
}

Main.java

public class Main {
    public static void main(String args[]) {
        Example ex1 = new Example();
        Example ex2 = new Example();
        Example[] ex3;

        ex3[0] = ex1;
        ex3[1] = ex2;

        Array2D a2d = new Array2D(ex3);
        Example[] finish = a2d.returnSomething();
    }
}

我在方法 2 中看到的唯一问题是,对于任何要提供给 Array2D 的 class,它都必须扩展 Arrayable。哦,事实上它需要两倍的时间来做。输入??

如果在这种情况下方法 1 是可行的方法,请提供示例。我基本上不熟悉通用 classes 和设置它们。谢谢!

据我了解,您希望它对所有类型的对象都是通用的,但是当您实例化它时,它应该只接受声明类型的子类。如果是这种情况,请使用泛型。实例化后,它会自动接受定义类型的子类。

基本上,使用您的第一种方法。然后像这样更改 main

public class Main {
    public static void main(String args[]) {

        Arrayable[] classArray = {
            new SubClass1(),
            new SubClass2()
        };

        Array2D<Arrayable> a2d = new Array2D<>(classArray);
        Arrayable[] array = a2d.returnSomething();
    }
}