使用接口作为返回类型时出错[Java]

时间:2015-01-09 14:01:37

标签: java interface

我有这两个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>

非常感谢。

5 个答案:

答案 0 :(得分:6)

Set<AImpl>Set<A>不完全相同,您无法转换它。 你可以:

  • 将p声明为Set<A>
  • 将p声明为Set<? extends A>
  • Set<AImpl>
  • 中返回methodName()

更多细节: 如果AImpl实现/扩展A,那么List<AImpl>不会实现/扩展List<A>List<? extends A>表示这是扩展/实现A的内容列表。

查看Wildcards and subtyping in Java Tutorial

答案 1 :(得分:2)

Patryk Dobrowolski's 回答

中添加内容

此问题Set<Car>Set<Vehicle>不同,请注意CarVehicle,但您无法添加Scooter,这也是Vehicle {1}}到Set<Car>Set<Vehicle>可能有CarBikeScooter等,但您无法在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