Как вернуть общую коллекцию в java

Я хотел бы сделать что-то подобное, но это не работает четко, любые предложения?

public HashSet<!--?--> insert(String word, int val, HashSet<!--?--> set) {

 if (val > 30) set.add(word);
 else set.add(val);

 return set;
}
2 ответа

Единственное, что вы можете сделать, поскольку вы добавляете значения в Set, и у вас есть как Integer и String как возможные типы (которые имеют только Object как обычный суперкласс):

public HashSet<object> insert(String word, int val, HashSet<object> set) { 
 if (val > 30) {
 set.add(word);
 } else {
 set.add(val);
 }
 return set;
}



 <p> Проблема здесь в том, что когда вы возвращаете <code>Set</code> вы <span>будете вынуждены отдать</span> свой элемент определенному типу (<code>Integer</code> или <code>String</code>). Возможно, вам нужно будет исследовать некоторое время при повторной разработке вашей модели, а затем попытаться эффективно работать с типами Generic.</p> </object></object>


Попробуйте это (но это не сработает):

public <t> Set<t> insert(String word, int val, Set<t> set) 
{
 if(val > 30)
 {
 set.add(word);
 }
 else 
 {
 set.add(val);
 }

 return set;
}
</t></t></t>

Кстати, этот код здесь, который находится внутри метода, работает только с Set<object> который вроде бы разрушает точку дженериков. <p> EDIT: Действительно, это не сработало, потому что T должен быть связан с расширением как String, так и Integer, что невозможно.</p> <p> Предполагается, что общий метод используется следующим образом:</p> <pre class="prettyprint linenums">public <t> Set<t> insert(T t, Set<t> set) { set.add(t); return set; } </t></t></t></pre> <p> Таким образом, вы можете поместить только определенный тип элементов в Set, так что вам не нужно бросать, когда вы их извлекаете. Например,</p> <pre class="prettyprint linenums">public static void main(String[] args) { Set<string> set = new HashSet<string>(); insert("Hello", set); insert("World!", set); for(String string : set) { System.out.println(string); } insert(562, set); //won't compile because it allows only strings } </string></string></pre> </object>

licensed under cc by-sa 3.0 with attribution.