我有一个界面值和一个类记录
public interface Value<T> {
T getRawValue();
}
public class Record<Value<T>> {
private Value<T> value;
T getRecordRawValue() {
return value.getRawValue();
}
}
Java不会编译这个并抱怨Generics声明&gt; 。有人可以告诉我为什么这是无效的语法?
答案 0 :(得分:7)
您需要绑定通用类型以指示它是Value<T>
的要求,并且还需要保留值Value<T>
提供的类型,因此您的Record
类要求两种泛型类型:T:返回值的类型和U:表示Value<T>
public class Record<T, U extends Value<T>>
这里有一个完整的例子:
public interface Value<T> {
T getRawValue();
}
public class Record<T, U extends Value<T>> {
public Record(U value) {
this.value = value;
}
private U value;
T getRecordRawValue() {
return value.getRawValue();
}
}
public class StringValue implements Value<String> {
@Override
public String getRawValue() {
return "raw";
}
}
public class StrongValue implements Value<String> {
@Override
public String getRawValue() {
return "Rrrrraaawww";
}
}
public class StringRecord extends Record<String, StringValue> {
public StringRecord(StringValue valueProvider) {
super(valueProvider);
}
public String report() {
return super.getRecordRawValue();
}
}
答案 1 :(得分:2)
代码public class Record<Value<T>>
尝试为名为Value<T>
的类声明泛型类型参数,但在声明泛型类型参数时,它应该是一个简单的标识符,例如T
。< / p>
尝试
public class Record<T>
答案 2 :(得分:1)
您的Record
课程被错误地声明了。它应该是
public class Record<T> {
//contents...
}