2017-05-04 2 views
-1

J'ai appris que le système de type Java suit une règle de sous-typage rompue en ce sens qu'il traite les tableaux comme covariants. J'ai lu en ligne que si l'argument d'une méthode est lu et modifié, la seule option de type sécurité est l'invariance qui a du sens et nous pouvons en donner quelques exemples simples en Java.Java vérifiant dynamiquement le type d'un objet

Est-ce que le correctif de Java de cette règle consiste à vérifier dynamiquement le type d'un objet stocké en termes de performances? Je ne peux pas imaginer que ce serait plus d'une ou deux instructions supplémentaires pour vérifier le type de l'objet. Une question de suivi est, en ignorant les différences de performance au moment de l'exécution, est-ce l'équivalent d'avoir une règle de sous-typage non-rompue pour les tableaux? Pardonne-moi si mes questions sont élémentaires!

+1

Si vous downvote, pouvez-vous au moins m'aider en me disant ce que je fais mal? Si vous trouvez un problème avec cette question, Si c'est une question en double, ou si vous êtes mieux à googler que je suis? – Poptart

+1

Probablement rejeté parce que vous ne posez pas une question de code ou une question spécifique. Cela semble plus approprié pour une discussion sur https://softwareengineering.stackexchange.com. – tima

Répondre

1

La performance est toujours un sujet délicat. Selon le contexte, de tels contrôles peuvent être complètement optimisés. Par exemple:

public static void main(String[] args){ 
    Object[] array = new String[2]; 
    array[0] = "Hello, World!";//compiler knows this is safe 
    System.out.println(array[0]); 
    array[1] = new Object();//compiler knows this will throw 
} 

Ici, le compilateur a accès au type réel du tableau au cours des deux missions, de sorte que les contrôles en temps d'exécution ne sont pas strictement nécessaire (si le compilateur est assez intelligent, il peut les optimiser en).

Dans cet exemple, cependant, un contrôle d'exécution est nécessaire:

public static void main(String[] args){ 
    Object[] array = Math.random()<.5? new String[2]: new Object[2]; 
    array[0] = "Hello, World!";//compiler knows this is safe 
    System.out.println(array[0]); 
    array[1] = new Object();//compiler must check array type 
} 

choses devient encore plus complexe si l'on considère les bending optimisations juste à temps qui peut avoir lieu! Bien que globalement, oui, comme avec de nombreuses fonctionnalités de sécurité de Java, il y a un coût de performance nécessaire. Que cela soit visible ou non dépendra de votre cas d'utilisation. Comme pour la question d'équivalence: Non, ce n'est pas la même chose que d'avoir des tableaux invariants. Les tableaux invariants feraient Object[] array = new String[2]; une erreur de compilation.

0

Je trouve un article qui semble répondre à votre question:

« Java fournit trois façons différentes de trouver le type d'objet à l'exécution. instanceof mot-clé, getClass() et isInstance() méthode de java.lang.Class Sur trois seulement getClass() est celui qui trouve exactement le type d'objet alors que d'autres retournent aussi vrai si Type d'objet est le type super. " À partir de là, il semble que vous devriez être capable d'écrire MyObject.getClass() et cela retournera la classe d'objets. Ou vous pouvez utiliser MyObject.isInstance(TheObject) et cela retournera vrai si MyObjectestTheObject. Troisièmement, vous devriez être en mesure de:

if (MyObject instanceof TheObject) { 
//your code 
} 

Here est le lien vers la page web

également ici est un lien vers un autre poste qui peut aider à clarifier:

Java isInstance vs instanceOf operator

également ici sont deux autres liens vers d'autres questions similaires:

How to determine an object's class (in Java)?

java - How do I check if my object is of type of a given class?

+0

Merci pour la réponse! Je n'écris aucun code; Je suis plus curieux de savoir ce qui se passe dans les coulisses chaque fois que j'insère un objet. Est-ce que Java appelle automatiquement 'isInstance()' quand j'insère un objet ou dois-je le faire moi-même? – Poptart

+0

Je ne comprends malheureusement pas votre question. 'isInstance()' est seulement une fonction qui vous permet de vérifier votre objet. Pourquoi serait-il appelé automatiquement? – JFreeman

+0

En fait, pas que vous le mentionnez, je crois que Java lit automatiquement votre code et vérifie que vous n'avez affecté que des objets existants. Par exemple, si j'écris 'int myInt = myString' et' String myString = "hi" 'ça casserait. – JFreeman