我有这两个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>
非常感谢。
答案 0 :(得分:6)
Set<AImpl>
与Set<A>
不完全相同,您无法转换它。
你可以:
Set<A>
Set<? extends A>
Set<AImpl>
methodName()
更多细节:
如果AImpl
实现/扩展A,那么List<AImpl>
不会实现/扩展List<A>
。
List<? extends A>
表示这是扩展/实现A的内容列表。
答案 1 :(得分:2)
在Patryk Dobrowolski's
回答
此问题Set<Car>
与Set<Vehicle>
不同,请注意Car
是Vehicle
,但您无法添加Scooter
,这也是Vehicle
{1}}到Set<Car>
但Set<Vehicle>
可能有Car
,Bike
,Scooter
等,但您无法在Set<Car>
中添加其他广告系列}。
答案 2 :(得分:0)
Set<AImpl>
至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>
。
答案 3 :(得分:0)
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;
}
答案 4 :(得分:0)
首先让我们讨论一下你收到此错误的原因
在班级BImpl
中,您创建了一个Aimpl
类型的变量。在该方法中,您具有返回类型的接口类A
。
在该方法中,您尝试返回类型Aimpl
的值。但是,编译器期望返回值为A
的类型。这就是你收到此错误的原因
现在该怎么做呢
按照Patryk的建议将方法的返回类型更改为Set<Aimpl>
或声明p