1

我有一个接口 Value 和一个类 Record

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

public class Record<Value<T>> {

    private Value<T> value;     

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

}

Java 不会编译它并抱怨泛型声明 > 。有人可以告诉我为什么这是无效的语法吗?

4

3 回答 3

7

您需要绑定泛型类型以表明它是 a 的要求Value<T>,并且您还需要保留 valueValue<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();
    }
}
于 2013-04-25T16:50:40.813 回答
2

代码public class Record<Value<T>>尝试为名为 的类Value<T>声明一个泛型类型参数,但在声明泛型类型参数时,它应该是一个简单的标识符,例如T

尝试

public class Record<T>
于 2013-04-25T16:33:23.877 回答
1

你的Record班级被错误地声明了。它应该是

public class Record<T> {
    //contents...
}
于 2013-04-25T16:33:39.663 回答