2016-11-23 11 views
7

Poniżej moja uproszczona realizacja wykresnie można przekonwertować listę błędów w liście leków generycznych java

import java.util.ArrayList; 
import java.util.List; 

public class TreeNode<E extends Comparable<E>> { 
    private E data; 
    private List<TreeNode<E>> children; 

    public TreeNode(E value) { 
     data = value; 
     children = new ArrayList<>(); 
    } 

    public E getData() { 
     return data; 
    } 

    public void setData(E data) { 
     this.data = data; 
    } 

    public List<TreeNode<E>> getChildren() { 
     return children; 
    } 

    public void setChildren(List<TreeNode<E>> children) { 
     this.children = children; 
    } 

} 

i piszę kod, aby się dowiedzieć, czy 2 węzły są połączone w reżyserii wykresie. Otrzymuję błąd kompilacji

public static boolean findIfPathExists(TreeNode<? extends Comparable<?>> start, TreeNode<? extends Comparable<?>> end) { 
    Set<TreeNode<? extends Comparable<?>>> visitedNodes = new HashSet<TreeNode<? extends Comparable<?>>>(); 
    return findIfPathExists(start, end, visitedNodes); 
} 

private static boolean findIfPathExists(TreeNode<? extends Comparable<?>> start, TreeNode<? extends Comparable<?>> end, 
     Set<TreeNode<? extends Comparable<?>>> visitedNodes) { 
    if(start == end) return true; 
    visitedNodes.add(start); 
    List<TreeNode<? extends Comparable<?>>> children = start.getChildren(); 
    for (TreeNode<? extends Comparable<?>> child : children) { 
     if(visitedNodes.contains(child)) continue; 
     if(findIfPathExists(child, end, visitedNodes)) return true; 
    } 
    return false; 
} 

otrzymuję błąd w linii start.getchildren

Type mismatch: cannot convert from List<TreeNode<capture #11 -of? extends 
Comparable<?>>> to List<TreeNode<? extends Comparable<?>>> 
+0

Problem polega na tym, że symbole wieloznaczne może być cokolwiek, a więc kompilator nie pozwoli operacje jak pisać 'visitedNodes.add (start);' (które, jak sądzę, jest linią, w której pojawia się błąd - podpowiedź: nie każ nam zgadywać). – Thomas

+0

@Thomas przypuszczalnie ten zawierający 'List >>. –

Odpowiedz

6

Dodaj typ zmiennej do swoich podpisów metoda:

public static <T extends Comparable<T>> boolean findIfPathExists(
    TreeNode<T> start, TreeNode<T> end) { 

private static <T extends Comparable<T>> boolean findIfPathExists(
    TreeNode<T> start, TreeNode<T> end, Set<TreeNode<T>> visitedNodes) { 

a następnie użyć T gdziekolwiek obecnie mają ? extends Comparable<?>.

0

Jeśli chcesz zachować symbole wieloznaczne, zmienić linię z

List<TreeNode<? extends Comparable<?>>> children = start.getChildren() 

do

List<? extends TreeNode<? extends Comparable<?>>> children = start.getChildren(); 
Powiązane problemy