На первый взгляд, я подумал, что вы собираетесь больше узнать о коллекции стилей LISP, в которой у вас будет элемент head и список tail.Объединение некоторого кода дало мне следующее:
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.