Java 继承-父类数组和子类数组-转换
我的继承权有问题。我可以对父类和子类的单个实例执行所需的操作-正如预期的那样,父类的方法可以很好地处理子类的实例 但是,我看不到如何扩展使用父类数组的类,以允许我存储子类数组。很抱歉,代码太大了,但我不认为我可以用一个较小的代码片段来说明这个问题 有解决这个问题的好办法吗Java 继承-父类数组和子类数组-转换,java,generics,inheritance,Java,Generics,Inheritance,我的继承权有问题。我可以对父类和子类的单个实例执行所需的操作-正如预期的那样,父类的方法可以很好地处理子类的实例 但是,我看不到如何扩展使用父类数组的类,以允许我存储子类数组。很抱歉,代码太大了,但我不认为我可以用一个较小的代码片段来说明这个问题 有解决这个问题的好办法吗 public class TestIn { public static void main(String args[]) { CPUStats c = new CPUStats();
public class TestIn {
public static void main(String args[]) {
CPUStats c = new CPUStats();
c.set(4,5); // OK
c.dump();
CPUStatsArray ca = new CPUStatsArray(24);
ca.set(3, 21, 25); // Data for hour 3 = 21 and 25
ca.dump(); // Fails
}
}
class GenericStats {
long s[]; // The stats, e.g. [0]=CPU% and [1]=Mem%
// snip, more members
// Constructor setting statistics to all zeros
public GenericStats(int n) {
s = new long[n];
}
void set(long ... v) {
s = new long[v.length];
for (int i = 0 ; i < v.length ; i++)
s[i] = v[i];
}
void dump() {
for (int i = 0 ; i < s.length ; i++)
System.out.print(" [" + i + "] = " + s[i]);
System.out.println();
}
// snip, a few useful methods
}
class CPUStats extends GenericStats {
public CPUStats() {
super(2);
}
void dump() {
System.out.println("CPU% = " + s[0] + ", and Mem% = " + s[1]);
}
}
// class WhateverStats extends GenericStats {
// ....
// }
// So far so good, I can use the useful methods of GenericStats on a CPUStats object
// Now I want an array of sets of statistics, e.g. for 24 sets of stats, one per hour
class GenericStatsArray {
GenericStats gs[];
int gslen; // Length of s in each gs[] (not the length of gs[])
public GenericStatsArray(int numSets, int inlen) {
gs = new GenericStats[numSets]; // Problem caused by using the base class here
gslen = inlen;
}
// Set values for element (e.g. hour) n
void set(int n, long ... v) {
if (gs[n] == null)
gs[n] = new GenericStats(gslen);
gs[n].s = new long[v.length];
for (int i = 0 ; i < v.length ; i++)
gs[n].s[i] = v[i];
}
void dump() {
System.out.println("GenericStatsArray");
for (int i = 0 ; i < gs.length ; i++)
if (gs[i] != null) {
System.out.print("Array element [" + i + "] ");
gs[i].dump();
}
System.out.println("End GenericStatsArray\n");
}
}
class CPUStatsArray extends GenericStatsArray {
public CPUStatsArray(int numSets) {
super(numSets, 2);
}
// Set values for element (e.g. hour) n
void set(int n, long ... v) {
assert (v.length == 2);
super.set(n, v);
}
void dump() {
System.out.println("CPUStatsArray");
for (int i = 0 ; i < gs.length ; i++)
if (gs[i] != null) {
CPUStats c = (CPUStats) gs[i]; // This fails, 'GenericStats cannot be cast to CPUStats'
System.out.print("Array element [" + i + "] ");
c.dump();
}
System.out.println("End CPUStatsArray\n");
}
}
公共类测试{
公共静态void main(字符串参数[]){
CPUStats c=新的CPUStats();
c、 设置(4,5);//确定
c、 dump();
CPUStatsArray ca=新的CPUStatsArray(24);
ca.set(3,21,25);//第3小时的数据=21和25
ca.dump();//失败
}
}
类泛型状态{
长s[];//统计信息,例如[0]=CPU%和[1]=Mem%
//剪,更多的成员
//构造函数将统计信息设置为全零
公共通用状态(int n){
s=新长[n];
}
无效集(长…v){
s=新长[v.长度];
对于(int i=0;i
您应该为您的泛型STATSARRAY
使用泛型:
public class GenericStatsArray<T extends GenericStats> {
GenericStats[] gs;
int gslen;
public GenericStatsArray(int numSets, int inlen) {
gs = new GenericStats[numSets];
gslen = inlen;
}
//...
}
您打算如何创建数组“gs”?我猜子类必须这样做,因为它知道T的实际类型。父类不能,因为它在运行时不知道T。另外,在你的CPUStatsArray中,“T”应该是“CPUStats”@newacct:你是对的。我最近一直在写C代码,所以我忘记了类型擦除。您可以让子类来做,但也可以只使用GenericStats数组。
public abstract class GenericStatsArray<T extends GenericStats> {
// ...
protected abstract T NewT(int gslen);
// ...
gs[n] = NewT(gslen); // was: gs[n] = new GenericStats(gslen);
}
public class CPUStatsArray extends GenericStatsArray<CPUStats> {
protected CPUStats NewT(int gslen){
return new CPUStats(gslen);
}
}