2016-04-20 6 views
2

Ich möchte eine Methode implementieren, die den Vergleich von Objekten desselben Typs ermöglicht.Stellen Sie sicher, dass generische Vararg-Parameter vom selben Typ sind

Ist es machbar zu implementieren isOnceOf() zu Kompilierzeit Typ strict und geben Sie mir Kompilierungsfehler in Zeile 3?
Derzeit bekomme ich nur eine Warnung.

public static void main(String[] args) { 
    System.out.println(isOneOf(3, 1, 2, 3)); // true 
    System.out.println(isOneOf("A", "B", "C", "D")); // false 
    System.out.println(isOneOf(1, "B", "C", "D")); // false, warn 
} 

public static <T> boolean isOneOf(T obj, T mate, T... mates) { 
    if (obj == null) { 
     return false; 
    } 
    if (obj.equals(mate)) { 
     return true; 
    } 
    for (T m : mates) { 
     if (obj.equals(m)) { 
      return true; 
     } 
    } 
    return false; 
} 
+4

Typ-Inferenz arbeitet gegen Sie = /. – Tunaki

+1

Eigentlich können Sie ja: 'System.out.println (MyClass. isOneOf (1," B "," C "," D "));' wird fehlschlagen. Sie können den Aufrufer jedoch nicht zwingen, dieses Formular zu verwenden. –

+1

http://StackOverflow.com/Q/9299194/1743880 auch http://StackOverflow.com/Q/17390441/1743880. Auch verwandt http://stackoverflow.com/q/26538980/1743880 – Tunaki

Antwort

0

Danke, Tunaki. Next funktioniert wie erwartet.

public static <O, T extends O> boolean isMember(O obj, T mate, T... mates) { 
    if (obj == null) { 
     return false; 
    } 
    if (obj.equals(mate)) { 
     return true; 
    } 
    for (T m : mates) { 
     if (obj.equals(m)) { 
      return true; 
     } 
    } 
    return false; 
} 
+0

'MyClass. isMember (1," B "," C "," D ")' kompiliert zum Beispiel noch. – newacct

+0

der Punkt ist es, Benutzer zu helfen, Tippfehler zu beseitigen, wenn der Benutzer einige Fehler programmieren will, ist es ihm überlassen) –

+0

Es ist kein "Bug" - es ist perfekt typsicher. – newacct

Verwandte Themen