簡體   English   中英

使用接口作為返回類型時出錯[Java]

[英]Error using an Interface as a return type [Java]

我有這兩個Java接口:

第一個是:

public abstract interface A {

}

第二個是:

public abstract interface B {
    public abstract Set<A> methodName();
}

然后,我將這兩個接口實現為:

public class AImpl implements A {

}

和:

public class BImpl implements B {
    private Set<AImpl> p;  

    public Set<A> methodName() {
        return this.p;
    }
}

我不明白為什么我得到關於methodName()的實現的以下錯誤:

Type mismatch: cannot convert from Set<AImpl> to Set<A>

非常感謝你。

Set<AImpl>Set<A>不完全相同,你無法轉換它。 您可以:

  • 將p聲明為Set<A>
  • 將p聲明為Set<? extends A> Set<? extends A>
  • methodName()返回Set<AImpl>

更多細節:如果AImpl實現/擴展A,則List<AImpl>不實現/擴展List<A> List<? extends A> List<? extends A>意味着這是擴展/實現A的東西的列表。

在Java教程中查看通配符和子類型

Patryk Dobrowolski's 答案中添加一些東西

這里的問題是Set<Car>不同於Set<Vehicle>注意這里Car是一輛Vehicle但你不能添加Scooter ,它也是一輛VehicleSet<Car>但是Set<Vehicle>可能有CarBikeScooter等但你不能在Set<Car>添加其他車輛。

Set<AImpl> Set<A>Set<A>Set<AImpl>的類型為AImpl而不是A

public class BImpl implements B {
    private Set<A> p;  

    public Set<A> methodName() {
        return this.p;
    }
}

Set<AImpl> p更改為Set<A> p並將方法類型返回到Set<AImpl>

Set<A>Set<AImpl> 考慮如果可能的話會發生什么:

class AImpl implements A {...}
class AImpl2 implements A {...}

Set<AImpl> aimpls = new Set<AImpl>();
Set<A> foo = aimpls;
foo.add(new AImpl2());

AImpl value = aimpls.iterator().next(); //ClassCastException - it's actually an AImpl2

如果你只是要從p讀取,那么為它分配一個Set<AImpl>是安全的,但在這種情況下它應該是:

Set<? extends A> p;
public Set<? extends A> methodName() {
    return this.p;
}

首先讓我們討論一下為什么會出現此錯誤

BImpl類中,您創建了一個Aimpl類型的變量。 在該方法中,您具有返回類型的接口類A

在該方法中,您嘗試返回Aimpl類型的值。 但是,編譯器期望返回值為A類型。 這就是你得到這個錯誤的原因

現在該如何避免它

將方法的返回類型更改為Set<Aimpl>或根據Patryk的建議聲明p

暫無
暫無

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

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