簡體   English   中英

Java泛型 - 不在范圍內

[英]Java generics - not within bounds

我有以下無法編譯和生成Error:() java: type argument GroupOfPartsDecorImpl<V> is not within bounds of type-variable GOP示例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>>> GOP extends GroupOfParts<V, PartDecorator<V, ? extends Part<V>>>和GroupOfPartsDecorImpl應該在最后GroupOfParts<V, PartDecorator<V, Part<V>>為什么會出現此錯誤?

GroupOfParts的第二個通用參數必須是PartDecorator<V, ? extends Part<V>> PartDecorator<V, ? extends Part<V>> 並且由於泛型默認不變,因此不會有偏差。 但是GroupOfPartsDecorImpl使用PartDecorator<V, PartImpl1<V>> ,這是不一樣的,因此它不能編譯。

您可以通過在MainContainerGroupPartDecorator的聲明MainContainerGroupPartDecorator第二個參數協變來解決這個問題:

class MainContainerGroupPartDecorator<V, GOP extends GroupOfParts<V,
    ? extends PartDecorator<V, ? extends Part<V>>>> 
    extends BaseContainerGroupPartDecorator<V, GOP> {

(基本上改變PartDecorator<V, ? extends Part<V>> ? extends PartDecorator<V, ? extends Part<V>>? extends PartDecorator<V, ? extends Part<V>>

問題是你的第二個通用的第3級有界通配符? extends Part<V> ? extends Part<V> 您可以通過額外的通用P指定它

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;
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM