2011-04-08 5 views
0

En ce moment j'essaye d'implémenter this interface avec un int qui représente un nombre binaire.Comprendre les interfaces, les classes et les constructeurs dans Java

Je sais que je ne devrais pas implémenter to string();, mais supposons que je le devrais.

C'est ce que je l'ai écrit jusqu'à présent:

public class IPAddressInt implements IPAddress { 
private int ipAdress; 

public IPAddressInt(int num1,int num2, int num3, int num4){ 
    String n1=Integer.toBinaryString(num1); 
    String n2=Integer.toBinaryString(num2); 
    String n3=Integer.toBinaryString(num3); 
    String n4=Integer.toBinaryString(num4); 

    String finalString=n1+n2+n3+n4; 
    this.ipAdress=Integer.parseInt(finalString); 
} 

public String toString() { 
    return this.toString(); 


} 

quand je suis Tring revenir this.ipAdress.toString(); ou même ipAdress.toString() le compilateur dit qu'il Cannot invoke toString() on the primitive type int, et quand je n'écris que this.toString(); cela fonctionne. Pourquoi? Je sais qu'un int peut être converti en une chaîne, et comment se fait le this fonctionne et la déclaration entière n'est pas? ne devrait-il pas être le même? vais-je obtenir ce que je veux de toute façon?

Merci.

+0

@Andrew: Lol. Je l'ai changé. –

+0

Heureux de vous voir avoir un sens de l'humour et du bon sens. :-) J'espère que vous aurez une solution satisfaisante. –

Répondre

4

L'appel this.toString() va juste sauter - il appelle la même méthode récursivement, sans sortie.

La raison pour laquelle vous ne pouvez pas appeler toString directement sur ipAddress est que int est un type primitif, et vous ne pouvez pas appeler de méthodes sur les types primitifs. Pour convertir n'importe quoi en chaîne, utilisez String.valueOf(ipAddress). Pour int en particulier, vous pouvez utiliser Integer.toString(ipAddress).

Ce n'est pas vraiment clair pourquoi vous faites la conversion en une chaîne binaire en premier lieu ... cela ne me semble pas une bonne idée. Toute raison pour laquelle vous n'utilisez pas

ipAddress = (num1 << 24) | (num2 << 16) | (num3 << 8) | num4; 

(en supposant que chaque valeur est réellement comprise entre 0 et 255).

Je très doute que la représentation binaire est vraiment envie que vous voulez, en particulier compte tenu du manque de rembourrage, et que vous êtes alors essayer de l'analyser comme nombre décimal.

+0

@Jon: Merci pour le commentaire. Pouvez-vous expliquer ce que vous avez fait en créant ce type d'adresse IP? Est-ce mal de le mettre en pratique? Je suppose que ce ne sera pas le nombre entier puisque les zéros de gauche n'apparaîtront pas, non? –

+0

@Nir: Ce que vous voulez dire n'est pas clair. En général, ce n'est presque jamais une bonne idée de convertir une forme numérique (dans ce cas 4 entiers séparés) en une autre forme numérique (dans ce cas, 1 entier) en utilisant des conversions de chaîne. –

+0

@Jon: Je voudrais comprendre ce que cette expression: 'ipAddress = (num1 << 24) | (num2 << 16) | (num3 << 8) | num4; 'signifie. En utilisant cet opérateur bit à bit, vous convertissez automatiquement les nombres en une représentation binaire? –

0

Quand vous dites "ça marche" je suppose que vous voulez dire "il compile". Si vous appelez cette méthode toString, vous aurez un débordement de pile, ou peut-être juste une boucle infinie si votre compilateur/JVM est très intelligent. Pour convertir un int en une chaîne, appelez le Integer.toString(this.ipAdress). (Mais sort de préférence address correctement :-).)

[edited ajouter: après avoir écrit cela, je vois que dans une autre réponse Jon Skeet préfère String.valueOf plutôt que Integer.toString à cet effet. C'est un gars très intelligent et il a probablement une bonne raison. Ça va vouloir dire moins doit changer si vous changez le type de ipAddress - euh, je veux dire ipAdress, par exemple]

0

Ce que vous voulez est probablement à mettre en œuvre la méthode toString comme ceci:.

public String toString() 
{ 
    return Integer.toString(ipAdress); 
} 

Ce que dit le compilateur est vrai, car vous ne pouvez pas appeler les méthodes ANY sur les types primitifs. Vous devez placer la primitive int dans un Integer dont la méthode toString est implémentée.Le code extrait ci-dessus est juste une façon plus efficace d'appeler:

return Integer.valueOf(ipAdress).toString(); 
0

Votre méthode toString est récursivement appelle et finira à une exception de débordement de pile.

Essayez de convertir ipAdress à une chaîne comme ceci:

public String toString() { retour Integer.toString (ipAdress); FYI, votre variable ipAdress a une faute de frappe, devrait être ipAddress.

Questions connexes