Java: Pourquoi le besoin de taper fondit pour instanceof () dans equals ()? Est-ce pour le code de référence ou moins?

voix
0

Java débutant ici, j'ai une question fondamentale qui est la moitié a répondu par les réponses précédentes dans d'autres fils ou les documents, mais je ne comprends toujours pas pleinement le mécanisme et je veux être sûr que je couvre les fondamentaux (le code au fond, questions milieu).

En fait, je redéfinissant la méthode equals () pour vérifier si deux objets mydate ont la même date. Je fais un contrôle instanceof si l'objet o est un objet MaDate, alors vous tapez jeté un objet temporaire spécifique à un objet MaDate o, vous comparez les dates. Pourquoi type avez - vous jeté la variable temporaire à la classe MaDate de o, quand il est déjà de la classe MaDate?

  1. Utilisez-vous la variable temporaire comme une référence plus facile l'objet que vous souhaitez exécuter la comparaison equals ()? Parce que vous utilisez equals () en comparant MyDate.equals(MyOtherDate), dans le code si je ne désigne pas une variable pour tenir la référence, vous obtenez différentes erreurs (température ne peut pas être résolu en tant que variable, incompatibilité de type, etc essentiellement le compilateur ne sait pas où de regarder à moins que vous écrivez un tas plus de code).

2a. Certains des autres fils a dit quelque chose à l'effet que si instanceof vérifie si une instance est d'une classe, il vérifie la base de classe, mais ne vérifie pas une sous - classe. Vous faites le transtypage parce que vous dites spécifiquement le compilateur de vérifier pour cet objet spécifique (type coulée d'un objet général à un objet spécifique). NOTE: Cela pourrait être une version et la saveur question de type spécifique, j'ai vu différentes réponses à des questions similaires.

2b. La référence change coulée, et non l'objet lui-même. Donc, si les objets sont de la même classe, mais différentes sous-classes, ne serait-il échoueront à l'exécution, au lieu de compilation. Et je n'obtenir un ClassCastException?

public boolean equals(Object o) {
            if (o instanceof MyDate) {
                MyDate temp = (MyDate) o;
                if ((temp.day == day) && (temp.month == month) && (temp.year == year)) {
                    return true;
                }
            } 
            return false;
        }
Créé 14/01/2020 à 00:01
source utilisateur
Dans d'autres langues...                            


2 réponses

voix
0

Le compilateur Java ne comprend pas la classe de type de votre objet « o » comme étant MaDate. Cela arrive parce que vous avez reçu un paramètre de type objet il sera lu comme un objet. Pour accéder aux méthodes et propriétés du paramètre de type connu MaDate, vous devez dire au compilateur que c'est un objet de type MyDate. Ceci est la façon dont le compilateur va comprendre ce que vous faites. Maintenant , nous allons jeter un oeil à une autre vue vue.

Tous les types Java étend le type Objectqui signifie que chaque fois que vous écrivez une classe, vous étendons implicitement les Objectpropriétés publiques / protégées et les comportements. Voilà pourquoi vous êtes « dominante » la méthode equalsqui appartient au Objectgenre. Bon, quand vous faites une comparaison entre deux objets vous devez d' abord vérifier si les deux appartiennent au même type, comme vous l'avez fait dans votre exemple avec: if (o instanceof MyDate) { ... }veiller à ce que oest de type MyDate. Mais à ce moment, comme vous ne l' avez pas jeté « o » à « MaDate » le type que vous ne serez pas en mesure d'accéder aux propriétés spécifiques de mydate ou méthodes. Alors , pensez pendant un certain temps, si j'ai une classe Aqui étend ma classe , Bje serai en mesure d'accéder B méthodes publiques et des propriétés à l' intérieur A, mais je ne peux pas faire la même chose sur B parce que B ne peut pas voir ce qui se passe en bas l'arbre. Suivez-vous?

L'espoir que je pourrais répondre à vos doutes.

Créé 14/01/2020 à 00:16
source utilisateur

voix
2

Java a deux concepts liés mais distincts: le- types d'une expression , et le type d'exécution d'une valeur .

Ces concepts sont compatibles dans une certaine mesure; si une expression est de type MyDate, puis lorsque vous évaluez cette expression, vous obtenez soit une référence à un objet dont type d'exécution est soit MyDateou une sous - classe MyDate, ou si vous obtenez une référence null, ou si vous obtenez une exception ou d'une boucle infinie ou tout le reste. Mais les concepts sont séparés, et même si votre exécution-types sont très bien, il faut parfois donner le compilateur des informations supplémentaires sur les types.

> Pourquoi le type ne vous lancez la variable temporaire à la classe MaDate de o, quand il est déjà de la classe MaDate?

La variable oest de type Object, pas toujours de type MyDate. Il arrive à contenir une référence à un objet dont type d'exécution est MyDate(ou une sous - classe MyDate), mais qui ne touche pas le type de o. Donc , vous écrivez (MyDate)opour créer une expression avec la même valeur (et donc le même type d'exécution) et le type désiré.

Si le compilateur était plus intelligent, il pourrait peut - être traiter ocomme ayant le type MyDatedans votre if-Déclaration, de sorte que vous ne auriez pas besoin la distribution; mais la spécification du langage Java actuelle ne permet pas. (Et si elle l'a fait, cela pourrait avoir des conséquences étranges en matière d'expédition de méthode statique.)

Créé 14/01/2020 à 00:21
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more