Подтвердить что ты не робот

Java: как установить значение по умолчанию для "T" в SomeClass <T>?

Можно ли указать тип по умолчанию для общего шаблона?

Скажем, у меня есть класс Monkey. Обезьяны могут жить в разных Environment s, таких как Jungle или Zoo:

    public class Monkey<T extends Environment>
    {
        T home;
        ...

        public T getHome()
        {
            return home;
        }  
    }

Есть ли способ указать значение по умолчанию для T, поэтому я могу использовать тип Monkey вместо Monkey<?> без предупреждения о компиляторе?

ИЗМЕНИТЬ

Другими словами, есть ли способ избавиться от предупреждения "raw type" без явного его подавления?

4b9b3361

Ответ 1

Нет, вы не можете этого сделать. Общие параметры не имеют значений по умолчанию. Вы можете повторно организовать иерархию типов, чтобы GenericMonkey и DefaultMonkey устанавливали общий параметр в желаемый по умолчанию.

Ответ 2

Нет, вы не можете: http://en.wikipedia.org/wiki/Comparison_of_Java_and_C%2B%2B

Параметры общего типа не могут иметь аргументы по умолчанию.

Как сделать что-то вроде этого:

public class Monkey extends Monkey<YourType>

Obviusly вы "потеряете" способность наследовать.

РЕДАКТИРОВАТЬ 1: Еще одна интересная вещь - сделать обратное тому, что я предложил,

public class Monkey<T> extends Monkey

В этом случае все классы generics Monkey наследуют Monkey, в некоторых случаях это очень интересная вещь (особенно если вы заметили, что некоторые методы экземпляра подходят во всех классах, не требуя общего). Этот подход используется в Castle ActiveRecord (я видел, как он использовался на С#, а не на Java), и я нахожу его красивым.

Ответ 3

Почему бы просто не использовать базовый класс Generic? Monkey<Environment>?

Ответ 4

Джен, ваш вопрос не ставит контекста вокруг того, почему вы хотите использовать дженерики. Было бы очень полезно, если бы вы заявили, что именно вы пытаетесь сделать, и почему вы используете дженерики. Дженерики существуют ИМХО главным образом, чтобы избежать необходимости делать классные броски повсюду, когда вставляете вещи и вынимаете их из коллекций, которые предназначены для универсальных держателей типов. Этот вид подразумевает итерацию над кучей вещей, но не обязательно.

Я хочу сказать, что я не видел какой-либо части вашего класса или кода, который требовал создания пользовательской версии класса обезьян, требующей итерации над средами. Если это не так, вам, вероятно, даже не нужны дженерики. Вместо этого вам, вероятно, нужна инъекция зависимостей. Класс обезьян должен иметь конструктор, который принимает среду. Среда - это интерфейс (или простой базовый класс). Интерфейс имеет несколько операций по умолчанию, таких как getBathroomLocation() и getFoodLocation(). Вместо использования дженериков для создания типа обезьяны, которая живет в зоопарке, вы создаете обезьяну и вводите зависимость среды, в которой она живет.

Monkey monkey = new Monkey(new CostaRicaJungle());

Позже вы можете настроить эту среду на нечто другое. Дикая обезьяна захватывается, и теперь вы делаете

monkey.setEnvironment(new BronxZoo());

Позже обезьяна получает обновление состояния жизни, и вы делаете

monkey.setEnvironment(new SanDiegoZoo());