首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >接口中的抽象类返回

接口中的抽象类返回
EN

Stack Overflow用户
提问于 2015-05-03 00:16:16
回答 4查看 1.6K关注 0票数 1

首先,在java中非常新,如果这是一个简单的问题,很抱歉。

我实现了一个抽象类,以及两个扩展它的类。

代码语言:javascript
复制
public abstract class Lado{
//body
}

和其他两个类,例如,下面的表单

代码语言:javascript
复制
public class Arista extends Lado
{ //body
}

所以,没有问题,现在我已经定义了这样一个接口。

代码语言:javascript
复制
public interface Grafo
{  //body
   public List<Lado> lados();
   //more body
}

您看到接口返回类Lado的列表了吗?但是在我的实现中,我需要返回一个类Arista或第二个类的列表(在接口的另一个实现上)。

在我必须用于接口实现的代码库中,有这样的lados()实现

代码语言:javascript
复制
    public List<Lado> lados() {
        return lados;
    }

在我的代码中定义了lados,如

代码语言:javascript
复制
   private List<Arista> lados;

并初始化

代码语言:javascript
复制
  lados = new LinkedList<Arista>();

当然,返回给出了一个错误

代码语言:javascript
复制
GrafoNoDirigido.java:141: error: incompatible types
    return lados;
           ^
   required: List<Lado>
   found:    List<Arista>
1 error

如果不修改提供给我的基本代码,我似乎无法找到如何解决这个问题(我重复一遍,不能更改它)。我知道我不能实例化抽象类对象,抽象类实现具有抽象类没有的值和函数。

而且,我不能使用覆盖的原因与在实现中更改函数签名的原因相同。

我会感谢你的帮助,谢谢。

如果有什么奇怪的地方,请告诉我。

-编辑-编辑

代码语言:javascript
复制
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子类

代码语言:javascript
复制
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>那样转换输出列表,但它也没有正确工作。

EN

回答 4

Stack Overflow用户

发布于 2015-05-03 00:22:17

因为Artista类也是Lado类,所以您的初始化应该是

代码语言:javascript
复制
List<Lado> lados = new LinkedList<>();
:
lados.add(new Artista (..));
:
return lados;
票数 1
EN

Stack Overflow用户

发布于 2015-05-03 00:26:24

问题是,Java对“方差”的支持不是很好(不,这不是一个简单的问题)。请看这里,在“解决方案”下面找到一个解决方案:https://schneide.wordpress.com/tag/upcast/

票数 0
EN

Stack Overflow用户

发布于 2015-05-03 00:43:59

如果无法更改方法返回类型或变量声明,则可以返回副本:

代码语言:javascript
复制
public List<Lado> lados() {
    return new LinkedList<Lado>(lados);
}

或者您可以返回一个包装器:

代码语言:javascript
复制
public List<Lado> lados() {
    return java.util.Collections.unmodifiableList(lados);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30008922

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档