使用泛型的接口实现泛型

时间:2013-04-25 16:29:09

标签: java generics nested-generics

我有一个界面值和一个类记录

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

public class Record<Value<T>> {

    private Value<T> value;     

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

}

Java不会编译这个并抱怨Generics声明&gt; 。有人可以告诉我为什么这是无效的语法?

3 个答案:

答案 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...
}