2013-06-22 3 views
0

Я хотел бы написать универсальный метод, который принимает набор, содержащий значения Integer или String. Метод должен разделять то, что задано Set, и возвращать список, который содержит наборы родового типа. Я совершенно новичок в дженериках и имею проблему с кодом, указанным ниже. Компилятору не нравится T в сигнатуре метода. В чем проблема?Параметры типа в методе

private List<Set<T>> createChunkSet(Set<T> set) { 
    Set<T> set = new HashSet<T>(); 
    return set; 
} 
+0

Ваш код должен знать, что 'T' является универсальным типом , а не какой-то сырой тип типа String. Где вы объявили 'T'? Является ли это в объявлении класса, например 'class MyClass {...}'? – Pshemo

+0

@Pshemo, ему не нужно. Это общий метод, не зависящий от объявления общего класса. –

+0

@RaviTrivedi Я немного изменил свой предыдущий комментарий. Я знаю, что это, вероятно, должен быть универсальным методом, но я пытаюсь заставить OP осознать, что если он хочет, чтобы «T» был родовым типом, ему нужно объявить его как общий в своем коде. – Pshemo

ответ

1

Изменение объявления метода:

private <T> List<Set<T>> createChunkSet(Set<T> set) { 
    // your code here 
} 

который получает набор включает в себя либо Integer или строковые значения

Set<T> может иметь элементы только одного типа, тип T, поэтому либо Integer, либо String, не оба.

+0

Вы попали в точку! Большое спасибо. Волшебные дженерики! ;-) –

0

Вы должны вернуть список на данный момент, когда вы возвращаете один список.

Изменить его:

private List<Set<T>> createChunkSet(Set<T> set) { 
    set = new HashSet<T>(); 
    List<Set<T>> list = new ArrayList<Set<T>>(); 
    list.add(set); 
    return list; 
} 
0

Я хотел бы написать общий метод, который получает набор, включая либо Integer или String, значения. Метод должен разделять это заданное значение Set и возвращать список, содержащий набор родового типа.

ОК, параметром этого метода должен быть java.util.Set. Объект является общим суперклассом для String и Integer.

Но тип возврата?

Требуется, чтобы возвращаемый список должен содержать 2 набора, набор и набор. Это не может быть написано на Java с использованием дженериков (а не на любом другом языке) - список типов - список объектов всех одинаковых типов!

То, что вы хотите для того чтобы достигнуть может быть сделано следующим образом:

public <T> Set<T> createChunkSet(Set<Object> set, Class<T> filterClass) { 
    Set<T> chunkedSet = new HashSet<T>(); 
    for (Object o : set) { 
     if (filterClass.isAssignableFrom(o.getClass())) { 
      chunkedSet.add(filterClass.cast(o)); 
     } 
    } 
    return chunkedSet; 
} 

Этот метод должен быть назван так:

Set<Integer> ints = createChunkSet(myUntypesSet, Integer.class);