Java 如何在抽象类中初始化泛型值?
我有一个具有泛型值的泛型抽象类,我想将其标记为final: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
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的作用。