0

我真的对泛型感到困惑,请帮助我解决我的情况:

public <M extends AgeFactor> void setAgeFActor(M m){
    System.out.println("referene receiveed"+m.factor); //WHAT SHOULD IT REFER TO?? AgeFactor or type given at Runtime as young
    this.factor=m.factor;
}

在上面的代码中,引用M mAgeFactor的是我在运行时给出的类型。假设我通过以下方式调用它:

ath1.setAgeFActor(new young()); //ath1 is referring to setAgeFActor method's class

和层次结构是:

class AgeFactor {
    String factor;
}

class young extends AgeFactor {
    String factor = "Young";

    public String toString() {
        return " " + factor + " ";

    }
}

class experienced extends AgeFactor {
    String factor = "Experienced";

    public String toString() {
        return " " + factor + " ";

    }
}

class pro extends AgeFactor {
    String factor = "Pro";

    public String toString() {
        return " " + factor + " ";

    }
}

我想知道的是为什么要m.factor提到AgeFactor's field factor?? m.factor应该指youngpro我在运行时给出的类型。

如果 m 实际上指的是 AgeFactor,那么我知道 m.factor 将始终指代 AgeFactor 的因子,因为多态性不适用于字段。如果是这样,那么泛型的需求是什么?Java的泛型本身是泛型的吗?请帮助我克服泛型。

4

2 回答 2

3

字段不会像方法那样被覆盖。如果你想要这种多态性,你必须用方法来做,而不是用字段。

在这里,experiencedandpro有两个不同的字段,名为factor,一个来自AgeFactor,一个来自experiencedand pro。它具有相同名称的事实完全是巧合:如果您有一个对象,并且所知道的只是它是一个AgeFactor,那么AgeFactor将使用该字段的版本。

这种设计的一个更明智的版本可能是只有一个名为 的字段factor,并在每个类的构造函数中设置它。

于 2013-07-15T20:07:11.627 回答
0

AgeFactor 是一个而不是一个接口。因此它(AgeFactor)有自己的实例变量。子类(比如young)有自己实例变量。子类的实例变量完全独立于任何子/超级实例变量。如上所述,只有非静态方法参与多态性(即,子类可以覆盖超类的方法)。做你想做的事情的一种方法是使用“getFactor”方法使 AgeFactor 成为一个接口。每个子类都将实现一个 getFactor() 方法,该方法返回所需的常量。

请注意,在 java 中,与 c++ 类转换不同,它不会更改对象引用值 - 因此方法引用会在转换之间保留。尝试以下操作:

class Ages
{
  public static void main(String args[])
  {
    young yy = new young();
    System.out.println(yy.toString());
    System.out.println(yy.factor);
    System.out.println(((AgeFactor) yy).toString());
    System.out.println(((AgeFactor) yy).factor);
    System.out.println(cc(yy));
  }

  static <AA extends AgeFactor> String cc(AA af)
  {
    return af.factor;
  }

  static class AgeFactor {
      String factor = "unknown";
      public String toString() {
          return " " + factor + " ";

      }
  }

  static class young extends AgeFactor {
      String factor = "Young";

      public String toString() {
          return " " + factor + " ";

      }
  }

  static class experienced extends AgeFactor {
      String factor = "Experienced";

      public String toString() {
          return " " + factor + " ";

      }
  }

  static class pro extends AgeFactor {
      String factor = "Pro";

      public String toString() {
          return " " + factor + " ";

      }
  }
}

另请注意,在 Java 中,泛型完全是编译时构造。通过称为擦除的过程,代码在编译时不引用“泛型”。

于 2013-07-15T21:15:57.037 回答