超类或泛型
Superclass or Generic Type
我需要能够理解哪种方法(下面列出)在 Java 环境中使用更有益。
因此我的问题是:我正在创建一个 class,我将在其中保存多个相同类型的对象,但是如果我将来想使用它,我想成为能够将不同的对象传递给 Array2D 的不同实例。它的名称是 Array2D,包含名为 rows
和 columns
的私有实例变量。但是,我想要做的是能够将任何对象(当你实例化它时)传递给这个 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();
}
}
我需要能够理解哪种方法(下面列出)在 Java 环境中使用更有益。
因此我的问题是:我正在创建一个 class,我将在其中保存多个相同类型的对象,但是如果我将来想使用它,我想成为能够将不同的对象传递给 Array2D 的不同实例。它的名称是 Array2D,包含名为 rows
和 columns
的私有实例变量。但是,我想要做的是能够将任何对象(当你实例化它时)传递给这个 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();
}
}