首先,在java中非常新,如果这是一个简单的问题,很抱歉。
我实现了一个抽象类,以及两个扩展它的类。
public abstract class Lado{
//body
}和其他两个类,例如,下面的表单
public class Arista extends Lado
{ //body
}所以,没有问题,现在我已经定义了这样一个接口。
public interface Grafo
{ //body
public List<Lado> lados();
//more body
}您看到接口返回类Lado的列表了吗?但是在我的实现中,我需要返回一个类Arista或第二个类的列表(在接口的另一个实现上)。
在我必须用于接口实现的代码库中,有这样的lados()实现
public List<Lado> lados() {
return lados;
}在我的代码中定义了lados,如
private List<Arista> lados;并初始化
lados = new LinkedList<Arista>();当然,返回给出了一个错误
GrafoNoDirigido.java:141: error: incompatible types
return lados;
^
required: List<Lado>
found: List<Arista>
1 error如果不修改提供给我的基本代码,我似乎无法找到如何解决这个问题(我重复一遍,不能更改它)。我知道我不能实例化抽象类对象,抽象类实现具有抽象类没有的值和函数。
而且,我不能使用覆盖的原因与在实现中更改函数签名的原因相同。
我会感谢你的帮助,谢谢。
如果有什么奇怪的地方,请告诉我。
-编辑-编辑
public abstract class Lado
{
private String id;
private double peso;
public Lado(String id, double peso) {
this.id = id;
this.peso = peso;
}
public String getId() {
return id;
}
public double getPeso() {
return peso;
}
public abstract String toString();
}Arista子类
public class Arista extends Lado
{
private Vertice u;
private Vertice v;
public Arista(String id, double peso, Vertice u, Vertice v){
super(id , peso);
this.u = u;
this.v = v;
}
public Vertice getExtremo1() {
return u;
}
public Vertice getExtremo2() {
return v;
}
public String toString() {
String s = "string";
return s;
}
}然后,如果我返回一个List<Lado>,如果y试图执行getExtremo1(),它会在编译中找到符号( Lado类中不存在),尝试像一个List<Arista>那样转换输出列表,但它也没有正确工作。
发布于 2015-05-03 00:22:17
因为Artista类也是Lado类,所以您的初始化应该是
List<Lado> lados = new LinkedList<>();
:
lados.add(new Artista (..));
:
return lados;发布于 2015-05-03 00:26:24
问题是,Java对“方差”的支持不是很好(不,这不是一个简单的问题)。请看这里,在“解决方案”下面找到一个解决方案:https://schneide.wordpress.com/tag/upcast/
发布于 2015-05-03 00:43:59
如果无法更改方法返回类型或变量声明,则可以返回副本:
public List<Lado> lados() {
return new LinkedList<Lado>(lados);
}或者您可以返回一个包装器:
public List<Lado> lados() {
return java.util.Collections.unmodifiableList(lados);
}https://stackoverflow.com/questions/30008922
复制相似问题