2015-11-18 1 views
4

Je joue avec le JShell et en essayant de convertir une variable à sa forme originale. Pour ce faire, je remis à zéro tout en utilisant REPL /r, je java.util.* et importé créé une liste:Convertir la variable à sa forme originale en JShell

-> import java.util.*; 

-> List<String> l = new ArrayList<>(Arrays.asList("a", "b")); 
| Modified variable l of type List<String> with initial value [a, b] 

Maintenant, je suis en train de convertir les valeurs listes en majuscules, donc je fais:

-> l.replaceAll(String::toUpperCase) 

-> l 
| Variable l of type List<String> has value [A, B] 

Listing la source exécutée que j'ai tapé à l'aide /list (ou /l) montre:

-> /l 

    1 : List<String> l = new ArrayList<>(Arrays.asList("a", "b")); 
    2 : l.replaceAll(String::toUpperCase) 
    3 : l 

maintenant, lorsque je tente de réinitialiser la liste à stade 1 (avant de changer ses valeurs), je reçois la déclaration import:

-> /1 
import java.util.*; 

Est-ce que quelqu'un sait pourquoi cela se produit? J'ai essayé la même chose sans l'instruction import, mais j'obtiens le même résultat (je suppose que c'est parce qu'il est importé explicitement).


Je viens de remarquer que si j'écris /l all je reçois:

-> /l all 

s1 : import java.util.*; 
s2 : import java.io.*; 
s3 : import java.math.*; 
s4 : import java.net.*; 
s5 : import java.util.concurrent.*; 
s6 : import java.util.prefs.*; 
s7 : import java.util.regex.*; 
s8 : void printf(String format, Object... args) { System.out.printf(format, args); } 
1 : String a = "a"; 
2 : a = "b" 

Je ne sais pas pourquoi /1 exécute la première instruction import et pas d'abord l'affectation des strings. Aussi c'est vraiment bizarre que même si import java.util.*; est là, s5 est import java.util.concurrent.*; (ce qui est clairement redondant).

Répondre

2

Modifier

On dirait que le problème a été résolu dans JDK 9 EA build 107 on 03-01-2016 (#4560).


Après des heures d'excavation, j'ai trouvé une explication. La commande:

/list all 

listes toutes exécutions, y compris les entrées de démarrage qui ont été s ilently et exécutées automatiquement avant REPL a commencé:

s1 : import java.util.*; 
s2 : import java.io.*; 
s3 : import java.math.*; 
s4 : import java.net.*; 
s5 : import java.util.concurrent.*; 
s6 : import java.util.prefs.*; 
s7 : import java.util.regex.*; 
s8 : void printf(String format, Object... args) { System.out.printf(format, args); } 
1 : String a = "a"; 
2 : a = "b" 

Une solution utilise le /setstart commande et transmettez-lui un fichier qui inclut les entrées que vous spécifiez. De cette façon, vous n'aurez pas les importations par défaut et la méthode d'impression pratique disponible pour vous.

L'autre solution écrirait /9 (état juste après la dernière entrée silencieuse).

Pour être honnête, je ne suis pas satisfait de l'une ou l'autre des solutions, j'espère qu'il y en aura bientôt une meilleure.

+0

/ Ré-exécute cet extrait. Il ne réinitialise pas l'exécution à ce stade. –