kzen.dev
  • Вопросы
  • Метки
  • Пользователи
Оповещения
Вознаграждения
Регистрация
После регистрации, сможете получать уведомления об ответах и комментариях на Ваши вопросы.
Вход
Если у Вас уже есть аккаунт, войдите чтобы проверить новые уведомления.
Тут будут вознаграждения за добавленные вопросы, ответы и комментарий.
Дополнительно
Источник
Редактировать
 Sbodd
Sbodd
Вопрос

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

Я'не уверен на 100%, что это хорошая идея, но сегодня я наткнулся на некоторый код, который'в настоящее время реализован как:

class MyWidget <T extends Enum<T> > {
  MyWidget(Map<T, Integer> valueMap) {
    mValueMap = valueMap;
  }

  Map<T, Integer> mValueMap;
}

где MyWidget затем предлагает методы, которые используют mValueMap для преобразования переданного Enum в / из Integer.

То, что я хотел сделать, это попытаться рефакторить это, чтобы я объявил свое перечисление:

interface MyInterface {
  public Integer getValue();
}

enum MyEnum implements MyInterface {
  foo, bar;
  public Integer getValue() {
    return ordinal();
  }
}

И тогда я смогу переписать MyWidget во что-то, что будет выглядеть примерно так:

public class MyWidget<T extends Enum<T> extends MyInterface> {
  ...
}

и затем смог бы вызвать метод getValue() из MyInterface на объектах T-типа внутри MyWidget. Проблема, конечно, в том, что "<T extends Enum<T> extends MyInterface>" не является правильным синтаксисом. Есть ли какой-нибудь способ сделать это?

Я не хочу просто иметь MyWidget<T extends MyInterface>, потому что важно, чтобы T было перечислением.

Заранее спасибо!

46 2009-07-01T18:44:09+00:00 2
Michael Myers
Michael Myers
Редактировал вопрос 1-го июля 2009 в 10:08
Программирование
java
generics
enums
Решение / Ответ
Michael Myers
Michael Myers
1-го июля 2009 в 6:45
2009-07-01T18:45:17+00:00
Дополнительно
Источник
Редактировать
#9219787

Вместо этого используйте '&':

public class MyWidget<T extends Enum<T> & MyInterface> {
    ...
}

В JLS это называется "тип пересечения", но я не могу найти упоминания о нем в учебниках по Java. Я просто скажу, что он делает именно то, что вы хотели, чтобы делало "extends".

Также, я должен упомянуть, что вы можете иметь столько типов, сколько хотите в типе пересечения. Так что, если вы хотите, вы можете сделать:

public class MyWidget<T extends Enum<T> & MyInterface & Serializable & Cloneable> {
    ...
}

[Примечание: этот пример кода не следует рассматривать как одобрение интерфейса Cloneable; он просто был удобен в то время].

 akokskis
akokskis
Редактировал ответ 7-го июля 2015 в 6:37
85
0
Alex Miller
Alex Miller
1-го июля 2009 в 8:06
2009-07-01T20:06:53+00:00
Дополнительно
Источник
Редактировать
#9219788

В JSR 203 (новый новый IO) для JDK 7 широко используются перечисления, реализующие интерфейсы (например: http://openjdk.java.net/projects/nio/javadoc/java/nio/file/FileVisitOption.html), что позволяет им в будущем иметь определенную свободу маневра для будущих дополнительных наборов опций перечислений. Так что это вполне осуществимый подход, и очевидно, что он был выбран после долгих размышлений в одном большом проекте Sun.

1
0
Похожие сообщества 11
pro.jvm
pro.jvm
5 814 пользователей
Сообщество разработчиков Java Scala Kotlin Groovy Clojure Чат для нач-их: @javastart Наш канал: @proJVM Вакансии: @jvmjobs @jvmjobschat ⚠️ Оффтоп -> @flood ❌Переход на личности ❌Троллинг ❌Реклама ❌HH (вакансии) ❌Варез
Открыть telegram
learn.java
learn.java
5 375 пользователей
Чат для начинающих и не только Статистика: https://combot.org/chat/-1001083535868 Основной чат - @jvmchat
Открыть telegram
Java & Co
Java & Co
4 434 пользователей
Можно обсуждать с матом и без всё, что касается жабы, вплоть до холиваров. НЕ ИМЕЕТ ОТНОШЕНИЯ К САЙТУ JAVARUSH.RU ПРАВИЛА - https://t.me/javarush/179171 Вакансии сюда - https://telegram.me/joinchat/B7IzvUCnfo6d8t3yIxKguQ По вопросам - @thedude
Открыть telegram
pro.JVM Jobs Chat
pro.JVM Jobs Chat
2 564 пользователей
Чат для обсуждения вакансий на JVM языках. Правила: - Никакого спама - Никакого троллинга и оскорблений участников - Размещение вакансий только через канал Канал для вакансий: @jvmjobs Основной чат: @jvmchat Наши друзья: @scala_jobs, @scala_jobs_feed
Открыть telegram
Java/Kotlin and more
Java/Kotlin and more
2 063 пользователей
чат о Java/Kotlin и связанных технологиях. We're discussing: job, tech questions etc. languages: russian, java, eng, kotlin Ссылка на чат: t.me/springframeworkio
Открыть telegram
Java Underground
Java Underground
1 751 пользователей
Библиотека по Java https://t.me/javalib Наше сообщество ВК: https://vk.com/javatutorial Вакансии и резюме свои строго в этот канал: https://t.me/job_java
Открыть telegram
Добавить вопрос
Категории
Все
Технологий
Культура / Отдых
Жизнь / Искусство
Наука
Профессии
Бизнес
Пользователи
Все
Новые
Популярные
1
Ilya Smirnov
Зарегистрирован 5 дней назад
2
Денис Васьков
Зарегистрирован 1 неделю назад
3
Dima Patrushev
Зарегистрирован 1 неделю назад
4
sirojidddin otaboyev
Зарегистрирован 2 недели назад
5
Елена Гайдамамакинат
Зарегистрирован 2 недели назад
ID
KO
RU
© kzen.dev 2023
Источник
stackoverflow.com
под лицензией cc by-sa 3.0 с атрибуцией