Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 继承-父类数组和子类数组-转换_Java_Generics_Inheritance - Fatal编程技术网

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