2015-06-24 4 views
0

Я пытаюсь сделать следующую функцию, которая подсчитывает количество различных элементов в любом массиве:Generic массив в качестве параметра

public static long distinctElements(T[] ar) 
{ 
    return Arrays.asList(ar).stream().distinct().count(); 
} 

Проблема здесь состоит в том, что я не могу использовать «T [] ар» как параметр (Java говорит, что он не знает тип T). Как я могу это исправить? Эта функция находится в классе утилиты, который не включает тип T (например, ArrayList и TreeSet do).

ответ

1

T не объявлен, поэтому компилятор жалуется на это. Объявить его в классе метода:

public static <T> long distinctElements(T[] ar) { 
    return Arrays.asList(ar).stream().distinct().count(); 
} 

Кроме того, вы могли бы облегчить создание списка с помощью Arrays#stream:

public static <T> long distinctElements(T[] ar) { 
    return Arrays.stream(ar).distinct().count(); 
} 
4
public static <T> long distinctElements(T[] ar) 

Если сделать магии.

2

Java не знает, что такое T. Например, это будет законное название для класса. Поэтому сначала вам нужно определить, что T является переменной типа.

Вы делаете это, поместив его в углах перед типом возвращаемого следующим образом:

public static <T> long distinctElements(T[] ar) { ... } 

Отметим также, что вам не нужны дженерики в вашем случае. Если A является подтипом B, то A[] также является подтипом B[] (это, кстати, не). Таким образом, вы также можете определить свой метод следующим образом:

public static long distinctElements(Object[] ar) { ... } 

a иметь возможность называть его точно такими же массивами, что и аргумент.