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

时间:2016-08-31 03:01:14

标签: java generalization

我正在做一个使用Adjacency List实现Graph的教程任务但是在构造函数中遇到了问题。

在给定的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
}

所以我需要编写一个类来实现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对象而没有错误,但这不是该类所需的:

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

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

2 个答案:

答案 0 :(得分:1)

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();
    }
}

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

答案 1 :(得分:1)

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

你的one-arg构造函数说T vertices;但是那时你正在对那里的(String)做一个“硬”演员。如果T是除String之外的其他东西,那么该代码将抛出异常。

所以,你应该让AdjList(顺便说一句可怕的名字)变成class AdjList implements FriendshipGraph<String>;或者当您不想将通用类型“修复”为字符串时,可以转到qty = Integer.parseInt(verties.toString())

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

然后:处理命名。绝对不需要使用像“qty”这样的缩写词;你为什么不称它为numberOfLists或类似的东西?!