Nano Hash - криптовалюты, майнинг, программирование

Дженерики Java и необработанный тип

Когда я пишу метод таким образом. Я получаю это предупреждение:

BaseEvent — это необработанный тип. Ссылки на универсальный тип BaseEvent должны быть параметризованы.

@Override
public <T extends BaseEvent> void actionPerformed(T event) { ... }

Код по-прежнему работает нормально, хотя предупреждающий знак раздражает. Когда я пишу код таким образом, предупреждение исчезает.

@Override
public <T> void actionPerformed(BaseEvent<T> event) { ... }

В предыдущем сообщении это не гарантирует, что это подкласс BaseEvent. Итак, я снова изменил его:

@Override
public <T extends EventObject> void actionPerformed(BaseEvent<T> event) { ... }


@Override
public <T extends BaseEvent<T>> void actionPerformed(BaseEvent<T> event) { ... }

Класс BaseEvent — это созданный мной класс, который расширяет EventOBject.

public abstract class BaseEvent<T> extends EventObject
{
    private String eventType;

    // Constructor
    public BaseEvent(Object source, String type) 
    {
        super(source);
        eventType = type;
    }


    public String getEventType()    { return eventType; }   
}

Все методы вроде работают нормально. Но мне было интересно, какое решение лучше.


Ответы:


1

Где вы используете T в определении BaseEvent? Определите его следующим образом

public abstract class BaseEvent extends EventObject

тогда вы не получите предупреждение с

@Override
public void actionPerformed(BaseEvent event) { ... }

ОБНОВЛЕНИЕ

Предположим, ваш BaseEvent действительно нуждается в параметризации. Затем напишите следующее

@Override
public <T> void actionPerformed(BaseEvent<T> event) { ... }

Это даст вам параметризованный метод.

ОБНОВЛЕНИЕ 1

It doesn't guarantee that is a subClass of BaseEvent.

Оно делает. <T> — это параметр шаблона метода. Этот параметр относится к BaseEvent<T>, который по определению является подклассом EventObject.

ОБНОВЛЕНИЕ 2

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

06.12.2012
  • Вы должны упомянуть, что то, что у вас есть в первом фрагменте кода public void actionPerformed(BaseEvent event) { ... }, работает точно так же, как и то, что есть у него в его первом фрагменте кода public <T extends BaseEvent> void actionPerformed(T event) { ... }. Оба принимают любой экземпляр BaseEvent, который, конечно же, включает подклассы BaseEvent. 07.12.2012
  • Эй, Димс, спасибо за объяснение. Я вынул параметр типа из BaseEvent. И спасибо за разъяснение, как его использовать, когда это необходимо. 08.12.2012

  • 2

    Параметр типа T никогда не используется в определении класса. Возможно, вы сможете удалить параметр типа из BaseEvent:

    public abstract class BaseEvent extends EventObject { ... }
    

    и просто определите свой метод без параметра типа:

    @Override
    public void actionPerformed(BaseEvent event) { ... }
    
    06.12.2012
  • Ваше право насчет того, что класс никогда не использует T. Я удалил его, и он отлично работает. Плюс выглядит намного чище 08.12.2012

  • 3

    Лучшее решение — это то, которое позволяет избежать предупреждений и гарантирует безопасность вашего типа во время компиляции.

    Если тип T в BaseEvent не имеет значения, не могли бы вы просто использовать свой первый и параметризовать BaseEvent? Сделайте что-нибудь вроде:

    @Override
    public <T extends BaseEvent<?>> void actionPerformed(T event) { ... }
    

    В качестве альтернативы, похоже, что ваш класс BaseEvent на самом деле ни для чего не использует T - почему он там?

    06.12.2012
  • Ваш он не нужен. Поэтому я удалил его. Первоначально я думал, что он должен быть там, чтобы я мог отслеживать тип события. 08.12.2012
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..