2017-09-19 1 views
1

In diesem Programm erstelle ich eine generische Methode, bei der der zweite Parameter den ersten Parameter erweitert, aber wenn ich String als erstes Paameter und Integer-Array als zweiten Parameter übergebe, läuft auch das Programm gut. Warum gibt es keinen Kompilierzeitfehler, da Integer String nicht erweitert?Warum gibt diese generische Methode keinen Fehler bei der Kompilierung?

class GenericMethodDemo { 

    static <T, V extends T> boolean isIn(T x, V[] y) { 

     for (int i = 0; i < y.length; i++) { 
      if (x.equals(y[i])) { 
       return true; 
      } 
     } 

     return false; 

    } 

    public static void main(String args[]) { 

     Integer nums[] = {1, 2, 3, 4, 5}; 

     if (!isIn("2", nums)) { 
      System.out.println("2 is not in nums"); 
     } 
    } 
} 
+0

nicht roh Typen verwenden, wenn Sie den Compiler wissen, über Ihre Generika wollen. – azurefrog

+0

Probieren Sie 'GenericMethodDemo. isIn (" 2 ", nums)' aus, und Sie erhalten einen Compiler-Fehler bezüglich der Übereinstimmung der Grenzen. – azurefrog

+0

Warum gibt es keinen Fehler in dieser Form –

Antwort

2

Dies kompiliert ohne Fehler als Typ System den nächsten gemeinsamen Supertyp zwischen den beiden Typargumente schließen.

Im angegebenen Beispiel ist der nächstliegende gemeinsame Supertyp Object.

Wenn wir einen Doppelpunkt als ersten Parameter angeben, wird Number der abgeleitete Typ sein, da es der nächste gemeinsame Supertyp zwischen Double und Integer ist.

public static void main(String args[]) { 

    Integer nums[] = {1, 2, 3, 4, 5}; 

    //In this case the nearest common type is object 
    if (!isIn("2", nums)) { 
     System.out.println("2 is not in nums"); 
    } 

    //In this case the nearest common type would be Number 
    if (!isIn(2d, nums)) { 
     System.out.println("2 is not in nums"); 
    }   
} 

Wie azurefrog erwähnt, Zusammenstellungsart Zeugen (GenericMethodDemo.<String, Integer>isIn("2", nums)) erforderlich wären, um Typinferenz zu verhindern, dass mit dem nächsten gemeinsamen Supertyp zu verhindern.

Die Java Language Specification Details Typinferenz bezüglich finden Sie hier: https://docs.oracle.com/javase/specs/jls/se8/html/jls-18.html

Verwandte Themen