簡體   English   中英

返回子類時方法的返回類型不兼容

[英]Incompatible return types for method when returning subclass

我正在嘗試定義一種方法來返回由簽名給出的圖形上給定頂點的所有鄰居

public abstract class GraphClass<V extends Vertex<?>,E extends Edge<V,?>> implements UndirectedGraph<V,E>{
.
.
.
        public ArrayList<V> getNeighbors(V v) {...}
}

我希望從擴展上述 GraphClass 的 KTree 類中重寫此方法,如下所示

public class KTree extends GraphClass<KVertex,KEdge> {...
    public ArrayList<KVertex> getNeighbors(KVertex v) {
            return v.getAdjList();
    }
}

這給了我以下錯誤

不兼容的類型。 找到'java.ustil.ArrayList>',需要'java.ustil.ArrayList'


KVertex 類還擴展了原始 Vertex 類,其中.getAdjList()方法位於

public class KVertex extends Vertex<Integer> {...}

 public class Vertex<V>{
        protected ArrayList<Vertex<V>> neighbours = new ArrayList<>();
        ...
        public ArrayList<Vertex<V>> getAdjList(){
            return neighbours;
        }
    }

我在編寫此方法時的假設是,由於 KVertex 繼承 Vertex 類並保留 is-a 關系,因此返回該類型的子類仍然應該是有效的返回類型。 我如何正確定義 KVertex 類或 getNeighbours 方法,以便我可以返回 Vertex 的任何子類的列表。 謝謝你!

主要問題在於 Vertex 類的方法

public ArrayList<Vertex<V>> getAdjList()
{
  return neighbours;
}

意味着它將為您的KVertex類返回一個ArrayList<Vertex<Integer>>

但是getNeighbours(V v)想要返回一個與ArrayList<Vertex<Integer>>沒有協變的ArrayList<KVertex>所以這不可能發生。 is-a關系在類之間有效,而不是在類型變量之間有效:a List<KVertex> is-not-a List<Vertex<Integer>>

您的問題的解決方案是將Vertex的真實類型傳遞給類本身,例如:

  class Vertex<V, R extends Vertex<V, R>>
  {
    protected List<R> neighbours = new ArrayList<>();

    public List<R> getAdjList()
    {
      return neighbours;
    }
  }

  public abstract class GraphClass<V extends Vertex<?,?>,E extends Edge<V,?>> implements UndirectedGraph<V,E>
  {
    public abstract List<? extends V> getNeighbors(V v);
  }

  public class KVertex extends Vertex<Integer, KVertex>
  {

  }


  public class KTree extends GraphClass<KVertex,KEdge>
  {
    @Override
    public List<KVertex> getNeighbors(KVertex v)
    {
       return v.getAdjList();
    }
  }

通過這種方式,您可以讓getAdjList返回擴展Vertex<V>類型的List

嗯......我不太確定,但也許這會奏效......

public class Vertex<V>{
        protected ArrayList<Vertex<V>> neighbours = new ArrayList<Vertex<V>>();
        ...
        public ArrayList<Vertex<V>> getAdjList(){
            return neighbours;
        }
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM