Java 接口中的抽象类返回
首先,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 }
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);
}