2017-01-06 3 views
3

Я пишу свою пользовательскую карту, у нее есть настраиваемый массив пар, а Map использует пару для операций.Java: Generic Array Creation

Они носят общий характер, я не знаю, что их тип может быть целым, строковым или двойным. Поэтому я не могу использовать ArrayList, это запрещено для меня.

public class FMap<K, V> { 
    private FPair<K, V>[] data; 
    int capacity=23; 
    int used=0; 

    public FMap(int cap){ 
     super(); 
     capacity=cap; 
     used =0; 
     data = new FPair[ capacity]; 
     for(int i=0; i< data.length; ++i) 
      data[i] = new FPair<K, V>(); 
} 

Но компилятор сказал:

javac -g -Xlint BigramDyn.java 
./TemplateLib/FMap.java:23: warning: [rawtypes] found raw type: FPair 
     data = new FPair[capacity]; 
       ^
    missing type arguments for generic class FPair<A,B> 
    where A,B are type-variables: 
    A extends Object declared in class FPair 
    B extends Object declared in class FPair 
./TemplateLib/FMap.java:23: warning: [unchecked] unchecked conversion 
     data = new FPair[capacity]; 
      ^
    required: FPair<K,V>[] 
    found: FPair[] 
    where K,V are type-variables: 
    K extends Object declared in class FMap 
    V extends Object declared in class FMap 
2 warnings 

, если я использую data = new FPair<K, V>[capacity] вместо data = new FPair[capacity]

Компилятор говорит:

TemplateLib/FMap.java:23: error: generic array creation 
     data = new FPair<K,V>[capacity]; 
      ^
1 error 

-

И в равной функции карты: я делаю: БПМЖ

FMap<K,V> otherPair = (FMap<K,V>) other; 

Но компилятор сказал:

./TemplateLib/FMap.java:34: warning: [unchecked] unchecked cast 
      FMap<A,B> otherPair = (FMap<A,B>) other; 
               ^
    required: FMap<A,B> 
    found: Object 
    where A,B are type-variables: 
    A extends Object declared in class FMap 
    B extends Object declared in class FMap 
1 warning 
+1

Возможный дубликат [Ошибка компиляции: создание общего массива] (http://stackoverflow.com/questions/7863792/compilation-error-generic-array-creation) – Seelenvirtuose

ответ

0

Вы не можете иметь массив универсального типа.

Просто введите массив неэквивалентных эквивалентов (как вы сказали) и бросьте их, когда вам нужно их использовать.

FMap[] myArray = something; 

.... 

@SuppressWarnings("unchecked") 
FMap<K, V> myGenericElement = (FMap<K, V>) myArray[index]; 

Или вы можете просто продолжать использовать нестандартную версию.

Литой должно быть хорошо, просто наденьте на него @SuppressWarnings("unchecked"). Перед тем, как сделать это, Вы должны быть в состоянии доказать, что Object имеет типа FMap однако (который может быть трудно, что, если я new FMap<Integer, String>().equals(new FMap<Double, Character>())?)

другого Вашим вариантом является просто бросить в FMap вместо.

+1

Но он работает так, как я хочу. Просто, когда я компилятор с Xlint, он дает мне некоторые ошибки. Я не хочу писать '@SuppressWarnings (" unchecked ")' Я хочу решить проблему. –

+0

Это решение этой проблемы. Компилятор не имеет информации о родовых типах, он знает, что это «объект». Вы должны сказать компилятору, чтобы игнорировать его, потому что вы знаете, что это правильно. – Moira

+1

Вы связываетесь с вопросом (и повторяете ответ), который отличается от этого. Проблема заключается не в массиве над типом, предоставляемым переменной типа, а массивом над общим типом. – Seelenvirtuose

0

Используйте ArrayList, как например:

List<FPair<K, V>> data = new ArrayList<>(capacity); 

Как ArrayList оборачивает массив у вас есть все удобства Список и функциональность массива.

Заполните только те данные, когда есть данные, а не new FPair<K, V>();.


В ArrayList не допускается:

data = (FPair<K, V>[]) new FPair<?, ?>[10]; 

<?, ?> или <Object, Object> будет удовлетворять компилятор (больше не сырья типа FPair не используется). Оскорбление/литье не повезло. Но по мере удаления типов фактической разницы нет.

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

Arrays.fill(data, new FPair<K, V>()); 

    Arrays.setAll(data, ix -> new FPair<K,V>()); 

Первый заполняющего же элемента на каждом positon, ПОЛЕЗНЫХ когда FPair не изменяется, но может быть разделен: когда " неизменный".

Второй - это просто причудливый способ петли.

+0

очень спасибо, но я не могу использовать это, потому что это запрещено для меня. Мой код работает как я хочу, но он дает только некоторые предупреждения. Это значит, что мой код неправильный, я не могу использовать общий массив, как он? –

+0

@ FurkanYıldız Предупреждение не обязательно означает, что ваш код неверен, '@ SuppressWarnings' ** совершенно приемлемо ** в некоторых случаях (в основном с генериками) – Moira