Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/362.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_Abstract Class - Fatal编程技术网

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

Java 如何在抽象类中初始化泛型值?,java,abstract-class,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 Integer

我有一个具有泛型值的泛型抽象类,我想将其标记为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);
  }
}
编译器强制我在抽象类中初始化泛型值,但这没有任何意义,因为该值是泛型的,只能在派生类中初始化


如何解决此问题?

您需要在声明最终变量时或在类的构造函数中指定它

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

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

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

公共抽象类值
{
最终T值;
保护值(T值){
这个。值=值;
}
静态类StringValue扩展值
{
StringValue(字符串值)
{
超级(价值+价值);
}
}
静态类IntegerValue扩展值
{
IntegerValue(整数值)
{
超级(值*值);
}
}
公共静态void main(字符串[]args)
{
StringValue s=新的StringValue(“你好”);
积分值i=新的积分值(42);
}
}

您需要在声明最终变量时指定它,或者在类的构造函数中指定它

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

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

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

公共抽象类值
{
最终T值;
保护值(T值){
这个。值=值;
}
静态类StringValue扩展值
{
StringValue(字符串值)
{
超级(价值+价值);
}
}
静态类IntegerValue扩展值
{
IntegerValue(整数值)
{
超级(值*值);
}
}
公共静态void main(字符串[]args)
{
StringValue s=新的StringValue(“你好”);
积分值i=新的积分值(42);
}
}

如果由于错误而无法使用super:
调用super必须是构造函数中的第一条语句
。是的,我理解错误消息。但是我不能这样做,因为构造函数以
if
语句开始,而
super
if
的主体中被调用。抱歉,该示例过于简化。您需要在if之前调用超级构造函数。@请编辑您的问题以显示if的功能。如果由于错误而无法使用超级:
调用超级必须是构造函数中的第一条语句。
。是的,我理解错误消息。但是我不能这样做,因为构造函数以
if
语句开始,而
super
if
的主体中被调用。抱歉,该示例过于简化。您需要在if之前调用超级构造函数。@请编辑您的问题以显示if的作用。