【问题标题】:Superclass or Generic Type超类或通用类型
【发布时间】:2016-05-28 09:46:02
【问题描述】:

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

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

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

方法二
创建一个可以扩展的超类以直接传递到 Array2D。

方法一示例:

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;
    }
}

方法二示例:

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 的任何类,它都必须扩展 Arrayable。哦,事实上它需要双倍的时间来完成。输入??

如果在这种情况下方法 1 是要走的路,请提供一个例子。我对泛型类和设置它们基本上是新手。谢谢!

【问题讨论】:

  • 这是一道作业题吗?我真的不确定您要做什么,Main 中的使用模型看起来与我期望使用数组类的方式完全不同。想详细说明这里发生了什么?
  • 对不起Main的凌乱,哈哈。我当时很急。不,这不是作业问题。我很好奇是否根据我的需要为我的 Array2D 类使用泛型。我对泛型完全陌生,但是给出的答案有所帮助。我不确定使用泛型是否允许传入任何类以供使用,但现在我知道是的,它就是这样工作的。 @markspace

标签: java arrays generics types superclass


【解决方案1】:

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

基本上,使用您的第一种方法。然后像这样更改您的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();
    }
} 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-01
    • 2015-10-21
    • 2016-04-13
    • 1970-01-01
    • 1970-01-01
    • 2018-02-01
    • 2013-10-19
    相关资源
    最近更新 更多