Запутанное использование дженериков Java: как мне правильно это настроить? - PullRequest
4 голосов
/ 05 марта 2010

Я смотрю код с этой формой:


     1  package com.stackoverflow.java.questions;

     2  import java.util.ArrayList;
     3  import java.util.List;

     4  public class B extends A<B> {
     5      
     6      private
     7      <C extends A>
     8      List<C> getList(Class<C> cls) {
     9          
    10          List<C> res = new ArrayList<C>();

                 // "snip"... some stuff happening in here, using cls

    11          return res;
    12      }

    13      public
    14      List<A> getList() {
    15          return getList(A.class);
    16      }

    17  }

    18  abstract class A<C extends A<C>> {

    19  }


Да, я знаю, что это уродливо, но я уменьшил его настолько, насколько смог.

У меня вопрос: как правильно настроить параметры использования A в строках 7, 14 и 15?

В настоящее время я получаю предупреждения (необработанный тип A: ссылки на универсальный тип A должны быть параметризованы) из Eclipse для строк 7 и 14. Я подозреваю, что я получу одно и для строки 15, как только исправлю два других , но я не уверен. В любом случае, он в настоящее время не параметризован и, вероятно, должен быть, но я понятия не имею, каким должен быть синтаксис.

Есть мысли о том, как добавить правильную семантику параметров и синтаксис, чтобы избавиться от этих предупреждений?

Примечание: я не уверен, имеет ли значение, является ли A рекурсивным универсальным. Я по-прежнему получаю те же предупреждения, если просто использую «абстрактный класс A {}» вместо его текущего определения.

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

Спасибо!

UPDATE:

Я могу ответить на предупреждения, задав их параметры, как и следовало ожидать, но за счет ошибки. Это сводится к тому, как я могу получить класс > из абстрактного класса?

Нечто подобное,

Класс > cls = A.class;

Однако это вызывает ошибку несоответствия типов.

ОБНОВЛЕНИЕ, часть 2:

Оказывается, ты просто не можешь этого сделать из-за стирания типа. Смотрите мой другой вопрос здесь.

Ответы [ 3 ]

4 голосов
/ 05 марта 2010

Вы можете начать с использования <C extends A<B>> и List<A<B>> в этих первых двух случаях. Передача ключа типа в этом случае контрпродуктивна (посмотрите, как параметр cls никогда не используется), поэтому просто удалите его.

(Вы всегда можете сказать B.<Foo>getList(), чтобы конкретизировать его конкретным типом, при условии, что вы довольны, что тип, конечно же, не был овеществлен.)


Обновление для включения редактирования OP: Будет ли работать A<?> для вашего кода? В некоторых случаях вам может не потребоваться полностью указывать тип. К сожалению, у меня нет вашего кода, поэтому только вы можете узнать, будет ли он работать.

0 голосов
/ 16 июля 2010

Оказывается, ты просто не можешь этого сделать из-за стирания типа. Смотрите мой другой вопрос здесь: Java: как получить литерал класса из универсального типа?

0 голосов
/ 08 марта 2010

Что именно вы делаете здесь с cls:

// "snip"... some stuff happening in here, using cls

В зависимости от того, что вы делаете здесь, вы можете заменить экземпляр Class на экземпляр Type, если вы расскажете мне немного больше о том, что вы делаете.здесь я могу представить вам альтернативное решение, чтобы оно заработало.

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