1

インターフェイス Value とクラス Record があります

public interface Value<T> {
    T getRawValue();
}

public class Record<Value<T>> {

    private Value<T> value;     

    T getRecordRawValue() {
        return value.getRawValue();
    }

}

Java はこれをコンパイルせず、Generics 宣言について不平を言います > 。これが無効な構文である理由について誰かが教えてくれますか?

4

3 に答える 3

7

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