Java泛型 - 不在范围内

时间:2017-05-22 08:04:58

标签: java generics type-bounds

我有以下无法编译并生成Error:() java: type argument GroupOfPartsDecorImpl<V> is not within bounds of type-variable GOP的示例。代码如下:

class MainContainerGroupPartDecorator<V, GOP extends GroupOfParts<V, PartDecorator<V, ? extends Part<V>>>> 
extends BaseContainerGroupPartDecorator<V, GOP> {
    public static <V> MainContainerGroupPartDecorator<V, GroupOfPartsDecorImpl<V>> getInstance() {
        return null;
    }
}

class BaseContainerGroupPartDecorator<V, GOP extends GroupOfParts<V, ?>> {
    void something() {}
}

class GroupOfPartsDecorImpl<V> implements GroupOfParts<V, PartDecorator<V, PartImpl1<V>>> {
    @Override
    public Collection<PartDecorator<V, PartImpl1<V>>> getParts() {
        return null;
    }
}

interface GroupOfParts<V, P extends Part<V>> {
    Collection<P> getParts();
}

class PartDecorator<V, P extends Part<V>> implements Part<V> {
    @Override
    public V getId() {
        return null;
    }
}

class PartImpl1<V> implements Part<V> {
    @Override
    public V getId() {
        return null;
    }
}

由于GOP是GOP extends GroupOfParts<V, PartDecorator<V, ? extends Part<V>>>而GroupOfPartsDecorImpl应该在最后GroupOfParts<V, PartDecorator<V, Part<V>>,为什么会出现此错误?

2 个答案:

答案 0 :(得分:2)

class MainContainerGroupPartDecorator<V, P extends Part<V>, GOP extends GroupOfParts<V, PartDecorator<V, P>>> extends BaseContainerGroupPartDecorator<V, GOP> { public static <V> MainContainerGroupPartDecorator<V,PartImpl1<V>, GroupOfPartsDecorImpl<V>> getInstance() { return null; } } 的第二个通用参数必须为GroupOfParts。并且由于泛型默认不变,因此不会有偏差。但PartDecorator<V, ? extends Part<V>>使用GroupOfPartsDecorImpl,这是不一样的,所以它不会编译。

您可以通过在PartDecorator<V, PartImpl1<V>>

的声明中使第二个参数协变来解决此问题
MainContainerGroupPartDecorator

(基本上将class MainContainerGroupPartDecorator<V, GOP extends GroupOfParts<V, ? extends PartDecorator<V, ? extends Part<V>>>> extends BaseContainerGroupPartDecorator<V, GOP> { 更改为PartDecorator<V, ? extends Part<V>>

答案 1 :(得分:1)

问题是你的第二个通用function check(callback) { var dfrd1 = $.Deferred(); console.log('checks start!'); $('#User_Email').mailgun_validator({ api_key: 'x', in_progress: validation_in_progress, // called when request is made to validator success: validation_success, // called when validator has returned error: validation_error, // called when an error reaching the validator has occured }).pipe(function(res){ dfrd1.resolve(res); }) console.log('checks complete! ErrorEmail='+ErrorEmail); return dfrd1; } 的第3级中的有界通配符。您可以通过其他通用? extends Part<V>

指定它
P