如何在抽象类中初始化泛型值?

cev*_*ing 1 java abstract-class

我有一个具有通用值的通用抽象类,我想将其标记为 final:

public abstract class Value<T>
{
  final T value;

  static class StringValue extends Value<String>
  {
    StringValue (String value)
    {
      this.value = value + value;
    }
  }

  static class IntegerValue extends Value<Integer>
  {
    IntegerValue (Integer value)
    {
      this.value = value * value;
    }
  }

  public static void main (String[] args)
  {
    StringValue  s = new StringValue ("Hello");
    IntegerValue i = new IntegerValue (42);
  }
}
Run Code Online (Sandbox Code Playgroud)

但这不起作用:

public abstract class Value<T>
{
  final T value;

  static class StringValue extends Value<String>
  {
    StringValue (String value)
    {
      this.value = value + value;
    }
  }

  static class IntegerValue extends Value<Integer>
  {
    IntegerValue (Integer value)
    {
      this.value = value * value;
    }
  }

  public static void main (String[] args)
  {
    StringValue  s = new StringValue ("Hello");
    IntegerValue i = new IntegerValue (42);
  }
}
Run Code Online (Sandbox Code Playgroud)

编译器强制我在抽象类中初始化泛型值,但这没有任何意义,因为值是泛型的,只能在派生类中初始化。

如何解决这个问题?

dan*_*1st 11

您需要在声明它时或在类的构造函数中分配一个 final 变量。

它不适用于子类的构造函数。

但是,抽象类可以有一个带有泛型类型作为参数的构造函数并使用它。

然后子类可以调用父构造函数:

public abstract class Value<T>
{
  final T value;
  protected Value(T value){
    this.value=value;
  }

  static class StringValue extends Value<String>
  {
    StringValue (String value)
    {
      super(value + value);
    }
  }

  static class IntegerValue extends Value<Integer>
  {
    IntegerValue (Integer value)
    {
      super(value * value);
    }
  }

  public static void main (String[] args)
  {
    StringValue  s = new StringValue ("Hello");
    IntegerValue i = new IntegerValue (42);
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 您需要在 if 之前调用超级构造函数。 (2认同)