Java Generics类未定义的构造函数

时间:2018-04-03 05:30:26

标签: java generics

我知道其他几个线程,但没有一个能解决我的问题。我确定这是一个简单的错误,但我对java泛型很新,而且很丢失。

我有一个包含以下内容的节点类:

public class Node<T> {
    private T label;

    public Node(T label) {
        if(label.equals(null)) {
            throw new NullPointerException("The parameter is null!");
        }
        this.label = label;
    }
}

Edge类由两个节点和一个T

类型的标签组成
public class Edge<N, T> {

    private Node<T> startNode;
    private Node<T> endNode;
    private T nodeLabel;

    public Edge(Node<T> start, Node<T> end, T label) {
        if(start == null || end == null || label == null) {
            throw new NullPointerException("One of the parameters was null!");
        }
        this.startNode = start;
        this.endNode = end;
        this.nodeLabel = label;
    }
}

我尝试使用以下变量创建边缘

Node<String> node1 = new Node<String>("A");
Node<String> node2 = new Node<String>("B");
Node<String> node3 = new Node<String>("C");
Node<String> node4 = new Node<String>("D");
String label1 = "1";
int label2 = 7;
Edge<Node<String>, String> edge1 = new Edge<Node<String>, String>(node1, node2, label1);
Edge<Node<String>, Integer> edge2 = new Edge<Node<String>, Integer>(node3, node4, label2);

创建edge2时,它会给出错误&#34;构造函数Edge&lt;节点&lt; String&gt;,Integer&gt;(Node,Node,int)未定义

2 个答案:

答案 0 :(得分:0)

在构造函数调用中,Node类中的“label”类型和Edge类中“label”的类型应该具有相同类型的对象。

因此以下行没有问题。因为你对所有这些都使用了'String'类型。

Edge<Node<String>, String> edge1 = new Edge<Node<String>, String>(node1, node2, label1);

但是另一行存在问题,因为你为Edge类使用了'String'类型,并且你为Node类使用了'int'类型。

Edge<Node<String>, Integer> edge2 = new Edge<Node<String>, Integer>(node3, node4, label2);

对于解决方案,您可以在Edge类中定义构造函数,如下所示:

public Edge(Node<String> start, Node<String> end, Integer label) { ... }

您可以将'label2'的类型更改为'String',如下所示:

String label2 = "7";

答案 1 :(得分:-1)

试试这个。请在代码中找到内联注释

public static void main(String[] args)
{
    Node<String> node1 = new Node<String>("A");
    Node<String> node2 = new Node<String>("B");
    Node<String> node3 = new Node<String>("C");
    Node<String> node4 = new Node<String>("D");
    String label1 = "1";
    int label2 = 7;
    Edge<Node<String>, String> edge1 = new Edge<Node<String>, String>(node1, node2, label1);
    Edge<Node<String>, Integer> edge2 = new Edge<Node<String>, Integer>(node3, node4, label2);
}
static class Node<T> {
    private T label;

    public Node(T label) {
        if(label.equals(null)) {
            throw new NullPointerException("The parameter is null!");
        }
        this.label = label;
    }
}
static class Edge<N extends Node<?>, T> {//here question mark or a new param 
//can be used to seperate the type of node and the type of edge. 
//Since node and edge type can be different hence, you should use 
//either different identifiers or wildcards

    private N startNode;//the node is of N type, previously it was of Node 
    //with T type, and you have defined T as Integer in edge2 call and 
    //hence the code was giving you compilation issue
    private N endNode;
    private T nodeLabel;

    public Edge(N start, N end, T label) {
        if(start == null || end == null || label == null) {
            throw new NullPointerException("One of the parameters was null!");
        }
        this.startNode = start;
        this.endNode = end;
        this.nodeLabel = label;
    }
}