我正在练习使用泛型类编程。我想为list元素实现一个类,该元素包含对泛型类型的对象的引用和对下一个列表元素的引用。
所以我想出了这堂课:
class List<T>{
T val;
List next:
}
您如何定义此类的构造函数?还有其他建议来理解泛型类及其用法吗?
答案 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传入的对象的类型相同。