// Uses raw types - unacceptable! (Item 26)
public static Set union(Set s1, Set s2) {
Set result = new HashSet(s1);
result.addAll(s2);
return result;
}
Um die Warnung zu entfernen und typsicher zu machen, schreiben Sie den Typparameter wie folgt zwischen den Methodenmodifikator und den Rückgabewert der Methode.
// Generic method
public static <E> Set<E> union(Set<E> s1, Set<E> s2) {
Set<E> result = new HashSet<>(s1);
result.addAll(s2);
return result;
}
identity_fn
Zuunaryoperator<t>
Ich bekomme eine Warnung, wenn ich zu wirkeidentity
関数は引数Zu変更せずに返却するので、warningZu抑制することができる。package tryAny.effectiveJava;
import java.util.function.UnaryOperator;
public class GenericsTest7 {
public static void main(String[] args) {
String[] strings = { "jute", "hemp", "nylon" };
UnaryOperator<String> sameString = identityFunction();
for (String s : strings)
System.out.println(sameString.apply(s));
Number[] numbers = { 1, 2.0, 3L };
UnaryOperator<Number> sameNumber = identityFunction();
for (Number n : numbers)
System.out.println(sameNumber.apply(n));
}
// Generic singleton factory pattern
private static UnaryOperator<Object> IDENTITY_FN = (t) -> t;
@SuppressWarnings("unchecked")
public static <T> UnaryOperator<T> identityFunction() {
return (UnaryOperator<T>) IDENTITY_FN;
}
}
public interface Comparable<T> {
int compareTo(T o);
}
`Collection
Neuanordnung, Sortierung und maximale / minimale Ableitung verwenden Elemente, die
`` Comparable``` implementieren. Diese Verfahren erfordern Elemente, die miteinander verglichen werden können und wie folgt ausgedrückt werden.// Using a recursive type bound to express mutual comparability
public static <E extends Comparable<E>> E max(Collection<E> c);
<e extends comparable<e>>
Repräsentiert "jedes Element e vergleichbar mit sich selbst".
Das Folgende ist die Max-Methode unter Verwendung rekursiver Grenzen.
package tryAny.effectiveJava;
import java.util.Collection;
import java.util.Objects;
public class GenericsTest8 {
// Returns max value in a collection - uses recursive type bound
public static <E extends Comparable<E>> E max(Collection<E> c) {
if (c.isEmpty())
throw new IllegalArgumentException("Empty collection");
E result = null;
for (E e : c)
if (result == null || e.compareTo(result) > 0)
result = Objects.requireNonNull(e);
return result;
}
}
Die obige Methode löst eine IllegalArgumentException aus, wenn die Liste leer ist. Eine gute Alternative ist ein Rückgabewert von `Optional <E>`
.