Java 泛化 - 构造函数不能应用于给定类型

Java generalization - constructor cannot be applied to given types

我正在执行有关使用邻接列表实现图形的教程任务,但构造函数出现问题。

在给定的 GraphTester.java 我有:

//Constructor cannot be applied to given types
FriendShipGraph<String> graph = new AdjList<String>();

然后FriendShipGraph.java提供接口:

public interface FriendshipGraph<T extends Object> {
    public static final int disconnectedDist = -1;

    public abstract void addVertex(T vertLabel);
    public abstract void addVertex(T srcLabel, T tarLabel);
    //Other abstract methods
}

所以我需要写一个class来实现一个LinkedList:

public class SinglyLinkedList implements LinkedListInterface {
    private Node head;
    private int length;

    public int getLength() {
        return length;
    }

    public SinglyLinkedList() {
        head = null;
        length = 0;
    }

    //Other methods to manage the linked list

    public class Node
    {
        private String value;
        private Node nextNode;

        public Node(String value) {
            this.value = value;
            nextNode = null;
        }

        //Other methods to manage node
    }
}

而且我必须使用 LinkedList 的数组来实现 Graph:

public class AdjList <T extends Object> implements FriendshipGraph<T> {
    SinglyLinkedList[] AdjList = null;

    //This is the constructor containing the error
    public AdjList(T vertices) {
        int qty = Integer.parseInt((String) vertices);
        AdjList = new SinglyLinkedList[qty];

    for (int i = 0; i < AdjList.length; i++)
        AdjList[i] = new SinglyLinkedList();
    }
}

然而,当我编写自己的测试文件时,我会像这样创建 AdjList 对象而不会出错,但这不是 class 所要求的:

AdjList<String> aList = new AdjList<String>("9");

所以任何人都请建议我如何修复构造函数。非常感谢!

FriendShipGraph<String> graph = new AdjList<String>();

您在 AdjJust 中没有零参数构造函数。如果您提供自己的构造函数,则不会生成默认的零参数构造函数,就像您对 AdjList(T vertices).

所做的那样

您需要提供默认构造函数。根据未显示的其他代码,类似以下内容可能就足够了:

public class AdjList <T extends Object> implements FriendshipGraph<T> {

    SinglyLinkedList[] AdjList = null;

    public AdjList() {

    }

    //This is the constructor containing the error
    public AdjList(T vertices) {
        int qty = Integer.parseInt((String) vertices);
        AdjList = new SinglyLinkedList[qty];

        for (int i = 0; i < AdjList.length; i++)
            AdjList[i] = new SinglyLinkedList();
    }
}

我不太确定你为什么要传递一个字符串来表示一个数量,但这至少应该可以解决你所询问的编译错误。

除了Trey的正确答案外,还有一些评论:

你的单参数构造函数说 T vertices;但是你正在那里做一个 "hard" 转换为 (String) 。如果 T 不是字符串,则该代码将抛出异常。

所以,您应该让 AdjList(顺便说一句,这个名字很糟糕)像 class AdjList implements FriendshipGraph<String>;或者当你不想 "fix" 通用类型为字符串时,你可以选择 qty = Integer.parseInt(verties.toString())

但是看看那个 - 听起来是不是很奇怪?你知道吗,把一些看起来像数字的东西变成一个字符串,然后从中解析出一个数字?也许它应该一直是一个整数?

然后:着手命名。绝对没有必要使用像"qty"这样的缩写;为什么不将其命名为 numberOfLists 或类似的名称?!