2017-12-26 9 views
1

Wenn ein generisches Verfahren implementiert, habe ich die folgende Anweisung:Generics - Richtige Behandlung für rohe Art Warnungen:

@SuppressWarning({"unchecked"}) 
private static <T extends Comparable<T>> T[] merge(T[] arrayA, T[] arrayB) { 
    ... 
    T[] result; 

// This is the line that needs that gives warnings  
    result = (T[]) Array.newInstance(arrayA.getClass().getComponentType(), arrayA.length + arrayB.length); 
    ... 

Nun, geben viele Programmierung Quellen, dass es zum guten Programmierstil mit @SuppressWarnings für unkontrollierte roh zu vermeiden Arten. In diesem Fall weiß ich jedoch nicht, wie ich diese Warnung im Code ansprechen soll. Sie suchen nach einem Best-Practice-generische Typen in Java instanziiert nicht ein klares Konzept nicht geben. Tatsächlich sind viele der gefundenen Lösungen weniger als ideal.

In diesem Teil des Codes, was wäre der beste Ansatz, um die Warnung des unformatierten Typs zu entfernen, ohne @SuppressWarnings der Methode hinzuzufügen? Ist das, was ich getan habe, der beste Ansatz?

Antwort

1

In einigen Fällen können Sie nicht vermeiden @SuppressWarnings. Selbst Standard-JDK-Klassen verwenden @SuppressWarnings("unchecked") im Umgang mit generischen Arrays.

Beispiel:

Arrays Klasse:

@SuppressWarnings("unchecked") 
public static <T> T[] copyOf(T[] original, int newLength) { 
    return (T[]) copyOf(original, newLength, original.getClass()); 
} 

Apropos Arrays.copyOf, können Sie diese Methode mit System.arraycopy anstelle der aktuellen Logik kombiniert verwenden:

private static <T extends Comparable<T>> T[] merge(T[] arrayA, T[] arrayB) { 
    T[] result = Arrays.copyOf (arrayA, arrayA.length+arrayB.length); 
    System.arraycopy (arrayB, 0, result, arrayA.length, arrayB.length); 
    return result; 
} 
+0

ehrfürchtig. Vielen Dank! –

Verwandte Themen