であるという要件を示すためにジェネリック型をバインドする必要があり、値が提供する Value<T>
型を保持する必要もあります。したがって、クラスには 2 つのジェネリック型が必要です。T: 返される値の型と U: 返される型を表すValue<T>
Record
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();
}
}