微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在抽象类中初始化通用值?

如何解决如何在抽象类中初始化通用值?

我有一个带有通用值的通用抽象类,我想将其标记为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);
  }
}

但这不起作用:

Value.java:9: error: cannot assign a value to final variable value
      this.value = value;
          ^
Value.java:17: error: cannot assign a value to final variable value
      this.value = value;
          ^
2 errors

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

如何解决此问题?

解决方法

您需要在声明时或在类的构造函数中分配最终变量。

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

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。