Общий класс для элементов списка - PullRequest
1 голос
/ 17 января 2011

Я занимаюсь программированием с общими классами. Я хочу реализовать класс для элемента списка, который содержит ссылку на объект универсального типа и ссылку на следующий элемент списка.

Итак, я придумал этот класс:

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

Как бы вы определили конструктор для этого класса? Любой другой совет, чтобы понять общие классы и их использование?

Ответы [ 4 ]

3 голосов
/ 17 января 2011

вы можете оставить его с конструктором по умолчанию, а затем использовать его 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 В ней содержится хорошее описание и множество примеров ее использования.

2 голосов
/ 17 января 2011

Это отличный ресурс, который поможет вам получить общее представление о генериках:

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

1 голос
/ 18 января 2011

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

1 голос
/ 18 января 2011

Возможно, вам полезно взглянуть на LinkedList, чтобы узнать, что вы пытаетесь сделать.

Javadoc: http://download.oracle.com/javase/6/docs/api/java/util/LinkedList.html Документы с исходным кодом и API Java можно скачать здесь: http://www.oracle.com/technetwork/java/javase/downloads/index.html

Вы сможете просмотреть исходный код и увидеть, как он на самом деле реализован с помощью Generics в Java.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...