我正在用泛型类练习编程。我想为一个列表元素实现一个类,该类包含对泛型类型对象的引用和对下一个列表元素的引用。
所以我想出了这门课:
class List<T>{
T val;
List next:
}
您将如何定义此类的构造函数?了解泛型类及其使用的任何其他建议?
我正在用泛型类练习编程。我想为一个列表元素实现一个类,该类包含对泛型类型对象的引用和对下一个列表元素的引用。
所以我想出了这门课:
class List<T>{
T val;
List next:
}
您将如何定义此类的构造函数?了解泛型类及其使用的任何其他建议?
您可以将其保留为默认构造函数,然后使用它 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 ,它包含了很好的描述以及如何使用它的大量示例。
这是一个很好的资源,可以帮助您了解泛型:
http://www.angelikalanger.com/GenericsFAQ/JavaGenericsFAQ.html
查看 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 中的泛型实际实现的。
乍一看,我以为您会使用更多的 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 传入的对象的类型相同。