如何在抽象 class 中初始化泛型值?
How to initialize a generic value in an abstract class?
我有一个带有通用值的通用摘要 class,我想将其标记为最终值:
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
编译器强制我在抽象class中初始化泛型值,但这没有任何意义,因为该值是泛型,只能在派生classes中初始化.
如何解决这个问题?
您需要在声明时或在 class.
的构造函数中分配最终变量
它不适用于子 classes 的构造函数。
但是,抽象 class 可以有一个以泛型类型作为参数的构造函数并使用它。
子 classes 然后可以调用父构造函数:
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);
}
}
我有一个带有通用值的通用摘要 class,我想将其标记为最终值:
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
编译器强制我在抽象class中初始化泛型值,但这没有任何意义,因为该值是泛型,只能在派生classes中初始化.
如何解决这个问题?
您需要在声明时或在 class.
的构造函数中分配最终变量它不适用于子 classes 的构造函数。
但是,抽象 class 可以有一个以泛型类型作为参数的构造函数并使用它。
子 classes 然后可以调用父构造函数:
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);
}
}