Студент, которого я обучаю, посещает занятия по веб-разработке, в которых используется книга Dietel по Java, в которой содержится любопытный фрагмент кода, связанный с дженериками:
class StackComposition <T>
{
private List<T> stackList;
public StackComposition()
{
stackList = new List<T>("stack") // ERROR
}
// .... more code
}
Мне очевидно, почему этот код не работает, и я недоумеваю, почему преподаватель рекомендует ученику использовать этот код в качестве отправной точки. Может быть, я просто не понимаю Generics, и мои навыки Java недостаточны, но я не понимаю, как можно создать экземпляр универсальной коллекции с помощью универсального типа. Я вижу, что цель состоит в том, чтобы создать стек с помощью универсальной коллекции List и определения типа во время выполнения, но я не понимаю, как это возможно с использованием приведенной выше конфигурации. Моей первой мыслью было предложить студенту использовать объект Generic Stack<T>
и забыть о написании этого пользовательского класса Stack, но, очевидно, это не является целью задания.
Я попытался в качестве теста использовать пакет java.lang.reflect
, чтобы обойти это, но, насколько я могу судить, это работает только с неуниверсальными контейнерами, такими как Array
:
public StackComposition(Class<T> type)
{
Object obj = Array.newInstance(type, 10);
}
stackList = new ArrayList<T>()
? - person Luiggi Mendoza   schedule 28.02.2013stackList = new List<T>("stack")
если вы имеете в видуjava.util.List
, вполне очевидно, почему эта строка не скомпилируется. потому что List - это интерфейс, и вы не можете его создать. - person PermGenError   schedule 28.02.2013List
- это пользовательский тип, посколькуany List implementing sub-types
не имеетconstructor
, который принимаетString
в качестве аргумента - person PermGenError   schedule 28.02.2013some.weird.package.List
, а не в представленном коде. - person Luiggi Mendoza   schedule 28.02.2013java.util.List
импорта. давайте подождем, пока ОП прояснит это .. :) - person PermGenError   schedule 28.02.2013java.util.List
, поскольку OP хотел инициализировать массив с помощью отражения (что становится более странным решением). - person Luiggi Mendoza   schedule 28.02.2013java.util.List
и пытался создать экземпляр абстрактного классаList<T>
. (Я все время забываю, что C# и Java — это, по сути, разные языки). Это может быть просто ошибка со стороны автора, или, возможно, они определили свой собственный класс List (наиболее вероятный случай). - person dtg   schedule 28.02.2013