列表元素的通用类

时间:2011-01-17 20:32:43

标签: java oop generic-programming

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

所以我想出了这堂课:

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

您如何定义此类的构造函数?还有其他建议来理解泛型类及其用法吗?

4 个答案:

答案 0 :(得分:3)

你可以使用默认构造函数,然后use it 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() );

结果应该打印“test”

至于建议,我认为最好的办法是阅读本书:Java Generics and Collections 它包含很好的描述和很多如何使用它的例子。

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

您可能需要查看LinkedList以了解您要执行的操作。

Javadoc:http://download.oracle.com/javase/6/docs/api/java/util/LinkedList.html 源API文档和Java API文档都可以在此处下载:http://www.oracle.com/technetwork/java/javase/downloads/index.html

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

答案 3 :(得分: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传入的对象的类型相同。