Quelle est la différence entre un type de temps de compilation et un type de temps d'exécution pour N'importe quel objet en Java?

Quelle est la différence entre le type de compilation time et run time d'un objet en Java ? Je suis en train de lire Java efficace livre et Joshua Bloch mentionne sur le type de temps de compilation et les types de temps d'exécution des instances de tableau dans L'article 26 plusieurs fois principalement pour décrire que la suppression des avertissements de coulée peut être Sécuritaire parfois.

// Appropriate suppression of unchecked warning
public E pop() {
 if (size == 0)
   throw new EmptyStackException();
   // push requires elements to be of type E, so cast is correct
   @SuppressWarnings("unchecked") E result = (E) elements[--size];
   elements[size] = null; // Eliminate obsolete reference
   return result;
}

ici, l'auteur parle de ces différents types de types dans le contexte des tableaux . Mais à travers ceci question j'aimerais comprendre la différence entre compile time types et run time types pour n'importe quel type d'objet .

6
demandé sur Geek 2013-02-19 21:40:59

3 réponses

Java est un langage statiquement typé, de sorte que le compilateur va essayer de déterminer les types de tout et s'assurer que tout est type sûr. Malheureusement, l'inférence de type statique est intrinsèquement limitée. Le compilateur doit être prudent et ne peut pas voir les informations d'exécution. Par conséquent, il sera incapable de prouver que certains codes sont tapesafe, même si elle est vraiment.

le type d'exécution se réfère au type réel de la variable à l'exécution. Comme le programmeur, vous le savez mieux que le compilateur, donc vous pouvez supprimer les avertissements quand vous savez qu'il est sûr de le faire.

par exemple, considérez le code suivant (qui ne sera pas compilé)

public class typetest{
    public static void main(String[] args){
        Object x = args;
        String[] y = x;

        System.out.println(y[0])
    }
}

la variable x aura toujours le type String[] , mais le compilateur n'est pas capable de le comprendre. Par conséquent, vous avez besoin d'un moulage explicite lorsque vous l'assignez à y .

11
répondu Antimony 2013-02-19 17:48:17

Java est statiquement typé. Cela signifie que chaque expression (y compris les variables) dans la langue a un type qui est connu au moment de la compilation selon les règles de la langue. C'est ce qu'on appelle le type statique (ce que vous appelez "type de compilation-time"). Les types en Java sont les types primitifs et les types de référence.

aussi, chaque objet à l'exécution en Java a une" classe "(ici," classe "inclut le tableau fictif" classes"), qui est connue à l'exécution. Le la classe d'un objet est la classe qu'un objet a été créé.

une partie de la confusion vient du fait que chaque classe (et type d'interface et de tableau) en Java a un type de référence correspondant, avec le nom de la classe (ou type d'interface ou de tableau). La valeur d'un type de référence est une référence, qui peut être null ou pointer vers un objet. Le langage Java est conçu de telle sorte qu'une référence de type de référence X , si Non null pointera toujours vers un objet dont la classe est la classe X ou une sous-classe de celle-ci (ou pour les interfaces, dont la classe met en œuvre la interface X).

notez que la classe runtime s'applique objects , mais les objets ne sont pas des valeurs en Java. Les Types, d'autre part, s'appliquent aux variables et aux expressions, qui sont des concepts de compilation. Une variable ou une expression ne peut jamais avoir la valeur d'un l'objet, car il n'y a pas de types d'objet; il peut avoir une valeur de référence qui pointe vers un objet.

1
répondu newacct 2013-02-19 21:19:01

je pense à" compiler time type " comme N'importe quel type qu'une variable peut avoir à compiler time. Cela inclurait la classe déclarée, toute superclasse, et toute interface implémentée.

à l'exécution, un objet donné n'a qu'une classe de plus bas niveau; il peut légalement être moulé ou assigné à une variable de cette classe, mais aussi à toute variable de l'une de ses sous-classes ou interfaces implémentées. Le compilateur vous permettra (souvent, de toute façon) la lancer à rien, mais l'exécution lèvera une exception si vous tentez d'affecter de quelque chose qui n'est pas légal.

une fois qu'un objet est assigné à la variable, le compilateur le traitera comme s'il s'agissait du type de la variable. Ainsi, une autre utilisation du "temps de compilation" pourrait être le type de variable, et vous pouvez contourner cela au temps de compilation en moulant vers un type différent aussi longtemps que vous savez que le cast sera légal à l'exécution.

si je parle de juste un type, je pense au "type d'exécution" d'une variable comme le fond réel (en haut?) niveau sous-classe de la variable; sous-classe la plus basse à laquelle elle pourrait être coulée. Mais je pense aussi de façon routinière à tout objet comme une instanciation de l'un de ses types juridiques.

Espère que ça aide.

0
répondu arcy 2013-02-19 18:15:53