Java : тип не применим для аргументов (K)

#java

Вопрос:

я получаю

Метод MakeSet(Сопоставимый) в типе UnionFindSet неприменим для аргументов (K)

И не знаю , как это решить, я пытался реализовать сопоставимое, но ничего не изменилось…

Узел моего класса

 public class Node <T extends Comparable<T>> implements Comparable<Node<T>>
 

Мой класс UnionFindSet использует узел :

 public class UnionFindSet <T extends Comparable<T>> 
 

Способ изготовления набора :

  public void makeSet(T data){
    Node<T> node = new Node<T>();
    node.data(data)
    .rank(0)
    .parent(node);
    node_map.put(data, node);
 }
 

Мой класс, в котором я получаю ошибку :

 public class Graph<K ,E>
 

и в методе :

 public void mstKruskal() {
    List<Edge<K, E>> secure_edges = new LinkedList<>();
    UnionFindSet partition = new UnionFindSet<>();
    List<Edge<K, E>> my_edges = new LinkedList<>();

    my_edges = this.getEdges();

    Collections.sort(my_edges, new Comparator<Edge<K, E>>() {
        @Override
        public int compare(Edge<K, E> left, Edge<K, E> right) {
            return (int) (left.getWeight() - right.getWeight());
        }
    });

    for (Map.Entry<K, List<Edge<K, E>>> entry : this.G.entrySet()) {
        partition.makeSet(entry.getKey()); //-------------------> here i get the error 
        
    }


    System.out.println(my_edges.toString());
}
 

Комментарии:

1. Почему вы используете необработанный тип » Раздел UnionFindSet = новый раздел UnionFindSet<>();` Не требует параметра UnionFindSet?

2. @мэтт правда , не заметил, что

3. @matt это в первой строке : метод MakeSet(Сопоставимый) в типе UnionFindSet неприменим для аргументов (K)

4. Выполнение : UnionFindSet<K> = новый UnionFindSet<K><K>(); Я получаю : Несоответствие привязки: Тип K не является допустимой заменой ограниченного параметра <K><T расширяет сопоставимый<T><T> типа UnionFindSet<T>><T>, я не думаю, что k сопоставим

5. вы имеете в виду график общедоступного класса<K , E, сопоставимый<K><K>> ? при этом все еще возникает ошибка

Ответ №1:

Что, по-видимому, произошло, вы создали класс, а затем создали «версию необработанного типа».

 UnionFindSet partition = new UnionFindSet<>();
 

Затем, когда вы попытаетесь использовать этот метод,

 public void makeSet(T data)
 

Это дает вам ошибку. Так как вы хотите использовать «набор(ключ)» для своего K типа. Чтобы исправить это, вам необходимо параметризовать UnionFindSet,

 UnionFindSet<K> partition = new UnionFindSet<>();
 

В этом есть ошибка, потому что вы не объявили K как сопоставимые, поэтому вы можете обновить объявление графика.

 class Graph<K extends Comparable<K>, E>
 

Таким образом, вы можете использовать K в качестве параметра набора UnionFindSet.