Я смотрю код с этой формой:
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:
Оказывается, ты просто не можешь этого сделать из-за стирания типа. Смотрите мой другой вопрос здесь.