[英]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>
非常感謝你。
在Patryk Dobrowolski's
答案中添加一些東西
這里的問題是Set<Car>
不同於Set<Vehicle>
注意這里Car
是一輛Vehicle
但你不能添加Scooter
,它也是一輛Vehicle
來Set<Car>
但是Set<Vehicle>
可能有Car
, Bike
, Scooter
等但你不能在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.