Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 接口中的抽象类返回_Java_Abstract Class - Fatal编程技术网

Java 接口中的抽象类返回

Java 接口中的抽象类返回,java,abstract-class,Java,Abstract Class,首先,java非常新,如果这是一个简单的问题,很抱歉 我实现了一个抽象类和两个扩展它的类 public abstract class Lado{ //body } 还有另外两个用这种形式表示的类 public class Arista extends Lado { //body } 所以,没问题,现在我有一个这样定义的接口 public interface Grafo { //body public List<Lado> lados(); //more body }

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

我实现了一个抽象类和两个扩展它的类

public abstract class Lado{
//body
}
还有另外两个用这种形式表示的类

public class Arista extends Lado
{ //body
}
所以,没问题,现在我有一个这样定义的接口

public interface Grafo
{  //body
   public List<Lado> lados();
   //more body
}
阿里斯塔亚类

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;
   }

}

然后,如果我返回一个
列表
如果我尝试执行
getExtremo1()
它在编译时找不到符号(Lado类上不存在),则尝试将输出列表转换为
列表
,但它也没有正常工作。

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

List<Lado> lados = new LinkedList<>();
:
lados.add(new Artista (..));
:
return lados;
List lados=newlinkedlist();
:
lados.add(新艺人(…);
:
返回lados;

尝试将界面更改为:

公共列表lados()


public List问题在于Java对枚举的“差异”没有很好的支持(不,这不是一个简单的问题)。请看这里,在“解决方案”下找到一个解决方案:

因此,以下是您的限制条件:

  • 无法更改lados()方法的返回类型(
    List
  • 您希望您的字段位于
    列表中
1。复制阵列

public List<Lado> lados() {
    return new ArrayList<>(lados);
}

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

public List<Lado> lados() {
    return new LinkedList<Lado>(lados);
}
公共列表lados(){
返回新的LinkedList(lados);
}
或者,您可以返回包装器:

public List<Lado> lados() {
    return java.util.Collections.unmodifiableList(lados);
}
公共列表lados(){
返回java.util.Collections.unmodifiableList(lados);
}


解决方案是将接口
Grafo
中的返回类型更改为
ListQ:您的哪些类实际实现了Grafo?@FoggyDay该类在一个名为GrafoDirigido的类和另一个名为Digrafo的类中实现,这两个类的工作率为90%,我只需要使lados()函数正常工作即可。pbabcdefp是的,它可以工作,不幸的是,我不能更改给我的函数基签名。谢谢。让我知道它是否有用。它工作,但会产生其他问题,例如,如果我在列表上迭代,那么编译器将看到每个元素,因为它是类lado,如果我需要使用Arista类的某些方法,它将失败。感谢您的时间。在迭代时,请使用instanceOf运算符询问对象是什么类。@LouisWasserman:我编辑并添加了另一个--OR--使他不需要泛型类型。@LouisWasserman:感谢您的提醒,我继续进行了一些测试用例的研究,直到找到一个可以替代的测试用例。我又把它修好了,现在两个都应该是可行的解决方案。第一个很好用,不幸的是已经有了一个负数来修改签名(我不理解这个限制)。秒是有效的,但当我执行lados=newlinkedlist()时,我将lados()定义为类的变量;它在返回时起作用,但是如果我在列表上执行任何其他操作,比如迭代,然后在其中一个对象上使用一个方法,那么我会出现错误,因为编译器将它们视为Lado而不是Arista。谢谢,这是一个有效的问题best@AlejandroDiaz:我需要查看您的迭代代码,以明确问题所在,但您可以执行类似的操作:
for(Lado-Lado:implclasinstance.lados()){if(Lado-instanceof-Arista){Arista Arista=(Arista)Lado;//在Arista上执行更多操作。}
,但是如果对行为模型和实现有更多的了解,可能会有更好的方法来扩展代码。Arista的with getId()函数行中的某些内容,而不是Lados上的内容,不想放完整的代码,原因非常广泛。如果我使用Arista元素来获取Arista,它会失败;如果使用lado ant try getId(),它也会失败。希望这有助于更好地理解错误<代码>ListIterator迭代器=lados.ListIterator();而(iterator.hasNext()){Lado element=iterator.next();if(element.getId().equals(“string”))返回元素;}
这是一个很糟糕的想法,它会损害类型安全并可能导致堆污染。它是否编译不是问题<代码>类Foo扩展Lado{}new GraphoImpl().lados().add(new Foo())它不安全,任何人都不应该使用它。好吧,您担心有人修改该列表。注意到这一点。我修改了答案以反映您的贡献。您应该删除原始类型的想法。如果没有人真正推荐,那就够糟糕的了。这只会导致可笑的虫子,像我这样的人必须过来解决它。不。这是危险的知识,但它是知识。复制是有效的,只需要检查当我捕捉到返回时是否可以看到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> lados = new LinkedList<>();
:
lados.add(new Artista (..));
:
return lados;
public List<? extends Lado> lados();
private List<Lado> lados;

@Override
public List<Lado> lados() {
    // Type of lados is List<Lado>, but we will fill it up with Arista instances...
    lados = new LinkedList<Lados>();
    lados.add(new Arista());
    // if Arista has methods that follow the with setter stereotype, ie: public Arista withId(int id) { this.setId(id); return this; } you can in-line create them:
    lados.add(new Arista()
              .withId(id)
              .withName(name)
    );
    Arista arista = new Arista();
    lados.add(arista);
    ...
    return lados;
}
public List<Lado> lados() {
    return new ArrayList<>(lados);
}
public List<Lado> lados() {
    return Collections.unmodifiableList(lados);
}
@SuppressWarnings("unchecked")
public List<Lado> lados() {
    return (List)lados;
}
public List<Lado> lados() {
    return new LinkedList<Lado>(lados);
}
public List<Lado> lados() {
    return java.util.Collections.unmodifiableList(lados);
}