2015-08-31 1 views
3
interface New<T> { 
    boolean func(T n, T v); 
} 
class MyFunc<T>{ 
T val; 
MyFunc(T val){ 
    this.val = val; 
} 
void Set(T val){ 
    this.val = val; 
} 
T Get(){ 
    return val; 
} 
boolean isEqual(MyFunc<T> o){ 
    if(val == o.val) return true; 
return false; 
} 
public class Main { 
    static <T> boolean check(New<T> n , T a, T b){ 
    return n.func(a,b); 
    } 
    public static void main(String args[]){ 
    int a = 321; 
    MyFunc<Integer> f1 = new MyFunc<Integer>(a); 
    MyFunc<Integer> f2 = new MyFunc<Integer>(a); 

    boolean result; 
    //f2.Set(f1.Get()); //if i uncomment this line result become true 
    System.out.println(f1.val + " " + f2.val); 
    System.out.println(); 

    result = check(MyFunc::isEqual, f1, f2); 
    System.out.println("f1 isEqual to f2: " + result); 
    } 
} 

Pourquoi résultat est faux quand 'a' est utilisé dans les deux f1 et f2? Pourquoi le résultat est-il vrai lorsque f2.Set(f1.Get()); est décommenté? S'il vous plaît expliquez-moi où je fais une erreur.étrange erreur logique dans le code Java

+0

Cela n'a pas de sens que le résultat soit ** false ** quand j'ai utilisé 'a' dans' f1' et 'f2'. et il devient ** vrai ** quand j'utilise 'f2.Set (f1.Get());' –

Répondre

5

Dans la méthode .isEquals(), vous comparez les objets wrapper avec l'opérateur ==, qui compare les références d'objets si elles ne se trouvent pas dans le cache interne Integer.

Depuis 321 est hors du cache Integer, l'opérateur == retourne false, car les références sont différentes (f1 fait référence à une autre adresse de mémoire que f2).

Lorsque vous explicitement définissez les références à égal (avec f2.Set(f1.Get())), alors il est pas surprenant que les résultats du programme true.

Si vous définissez a à quelque chose entre -128 et 127, le programme affichera true.

+0

Merci beaucoup pour votre réponse, Pouvez-vous me dire comment '321' est hors du cache' Integer' et pourquoi la sortie devient vraie si la valeur de 'a' est inférieure à 128 –

+1

Lire [cette discussion] (http://stackoverflow.com/questions/20897020/why-integer-class-caching-values-in-the-range- 128 à 127) –

3

a est auto boxed-Integer et int a = 321; vous aurez deux différents Objects pour f1 et f2.

PAR EXEMPLE

Integer a1 = new Integer(321); 
Integer a2 = new Integer(321); 

et a1 == a2 vous aurez false parce == comparer référence au lieu de la valeur que vous devez utiliser la méthode equals pour vérifier la valeur dans votre méthode isEqual.