1

我正在用泛型类练习编程。我想为一个列表元素实现一个类,该类包含对泛型类型对象的引用和对下一个列表元素的引用。

所以我想出了这门课:

class List<T>{
    T val;
    List next:
}

您将如何定义此类的构造函数?了解泛型类及其使用的任何其他建议?

4

4 回答 4

3

您可以将其保留为默认构造函数,然后使用它 List<String> list = new List<String>();- 现在您的类中的 val 将是 String。另一种方式:

public class List<T>{
    T val;
    List<T> next;

    public List(T val, List<T> next) {
        this.val = val;
        this.next = next;
    };

    public T getVal() {
        return val;
    }
}

然后你可以这样使用它:

List<String> strList = new List<String>("test", null);
System.out.println( strList.getVal() );

结果应该打印“测试”

至于建议,我认为最好的办法是阅读这本书:Java Generics and Collections ,它包含了很好的描述以及如何使用它的大量示例。

于 2011-01-17T20:46:50.357 回答
2

这是一个很好的资源,可以帮助您了解泛型:

http://www.angelikalanger.com/GenericsFAQ/JavaGenericsFAQ.html

于 2011-01-17T20:48:43.907 回答
1

查看 LinkedList 可能对您有所帮助。

Javadoc: http: //download.oracle.com/javase/6/docs/api/java/util/LinkedList.html 源代码和 Java API 文档都可以在这里下载:http ://www.oracle.com/技术网络/java/javase/downloads/index.html

您将能够查看源代码并了解它是如何使用 Java 中的泛型实际实现的。

于 2011-01-17T21:03:55.327 回答
1

乍一看,我以为您会使用更多的 LISP 样式集合,其中有一个“头”元素和一个“尾”列表。折腾一些代码给了我这个:

package generic.list;

import java.util.List;

public class GenericList<T>
{
    private T head;

    private GenericList<T> tail;

    public GenericList(List<T> initialList)
    {
        if ( !initialList.isEmpty() )
        {
            head = initialList.get(0);

            if ( initialList.size() > 1 )
            {
                tail = new GenericList<T>(initialList.subList(1, initialList.size()));
            }
        }
    }

    public T getHead()
    {
        return head;
    }

    public GenericList<T> getTail()
    {
        return tail;
    }
}

虽然这种结构可以导致对递归算法的一些非常好的研究,但当你尝试学习泛型时,它对你的帮助并不大。也就是说,这是我写的一个快速测试平台,以确保它确实有效:


package generic.list;

import static org.junit.Assert.*;

import java.util.Arrays;

import org.junit.Test;

public class GenericListTest
{
    private GenericList l;

    @Test
    public void testConstructorNoElements()
    {
        l = new GenericList(Arrays.asList(new String[] {}));

        assertNull(l.getHead());
        assertNull(l.getTail());
    }

    @Test
    public void testConstructorOneElement()
    {
        l = new GenericList(Arrays.asList("One"));

        assertNotNull(l.getHead());
        assertEquals("One", l.getHead());
        assertNull(l.getTail());
    }

    @Test
    public void testConstructorMultipleElements()
    {
        l = new GenericList(Arrays.asList("One", "Two", "Three"));

        assertNotNull(l.getHead());
        assertEquals("One", l.getHead());

        assertNotNull(l.getTail());
        assertEquals(l.getTail().getHead(), "Two");
        assertEquals(l.getTail().getTail().getHead(), "Three");
        assertNull(l.getTail().getTail().getTail());
    }
}

这至少应该让您更好地了解如何实例化和利用泛型类。

您可以在http://download.oracle.com/javase/tutorial/java/generics/index.html找到在线课程。

关于泛型,最重要的一点是,当您在类的名称中列出“T”时(如“GenericList”中),T 成为该类范围内的一个类。GenericList 之外的任何类都不知道 T 是什么,而 GenericList 甚至都不知道它是什么——它所知道的是,无论你在哪里看到 T,它都会与其他地方的 T 类型相同。因此,虽然 GenericList 不一定知道它存储的是什么,但它确实知道“head”(T)的类型与通过 initialList 传入的对象的类型相同。

于 2011-01-17T21:16:00.783 回答