2017-10-02 6 views
0

Tout en suivant un cours pour Java 8, nous sommes maintenant sur le sujet de et Lambda expressions. On nous a demandé de faire la méthode suivante Generic et non String seulement:Génériques et BiPredicate avec un type de retour incorrect

public static String betterString(String s1,String s2,IBetterString bs){ 
    if(bs.isBetter(s1, s2)){ 
     return s1; 
    }else{ 
     return s2; 
    } 
} 

Ce que je fait cela est jusqu'à présent les éléments suivants:

public static <T> betterEllement(T s1, T s2, BiPredicate<T, T> bi) { 
    if (bi.test(s1, s2)) { 
     return s1; 
    } else { 
     return s2; 
    } 
} 

Mais il semble que mon Return type selon Intellij est incorrect. Je ne comprends pas vraiment pourquoi c'est parce que j'ai défini <T> comme type de retour pour cette méthode. Désolé si c'est une question stupide, je suis juste un débutant et je voudrais comprendre pourquoi ce n'est pas correct. Parce que vous ne renvoyez rien à l'aide de votre méthode.

Répondre

5

<T> définit un type générique qui n'est pas encore connu. Cela ne veut pas dire que vous le retournez. Vous devez ajouter un autre T qui est la valeur de retour Type générique.

Son

public static <T> T betterEllement(T s1, T s2, BiPredicate<T, T> bi) { 
    if (bi.test(s1, s2)) { 
     return s1; 
    } else { 
     return s2; 
    } 
} 

<T> peut également être utilisé si vous connaissez la valeur de retour, mais à définir des arguments génériques.

public static <T> String getStringTest(T test) { 
    if (test.getClass().isInstance(WhatEver.class)) { ....} 
    return "test"; 
} 

Vous pouvez le voir parfaitement en utilisant une classe générique.

class TestGeneric<T> { 
    public T betterElement(T s1) { /** .. **/ return null; } 
} 
+1

Votre bienvenue. Garder en tete. T est juste un espace réservé. Il peut s'agir de n'importe quel caractère ou même d'une chaîne mais T est généralement utilisé puisqu'il s'agit d'un ype générique (T). –