Fare autoboxing e si comportano in modo diverso unboxing in Java e C #
-
22-09-2019 - |
Domanda
I sono la conversione manualmente il codice da Java (1.6) per C # e trovando qualche difficoltà con il comportamento di primitivi (int e doppio). In C # sembra che quasi tutte le conversioni avvengono automaticamente
List<double> list1 = new List<double>(); // legal, C#
double d0 = 3.0;
list1.Add(d0); // legal, C#
Double dd = 2.3f; // legal, C#
list1.Add(dd); // legal, C#
List<Double> list2 = new List<Double>(); // legal, C#
double d1 = 3.0;
list2.Add(d1); // legal, C#
list2.Add(2.0); // legal, C#
double d2 = list2.get(0); // legal, C#
, ma in Java solo alcuni sono autorizzati
List<double> list1 = new ArrayList<double>(); // illegal, Java
List<Double> list2 = new ArrayList<Double>(); // legal, Java
double d1 = 3.0;
list2.add(d1); // legal, Java
list2.add(2.0); // legal, Java
double d2 = list2.get(0); // legal, Java
Sarei grato per un'analisi sistematica delle differenze e di qualsiasi logica sottostante.
Soluzione
Nel vostro C # esempio non c'è la boxe o unboxing (e autoboxing) accadendo. double
è solo un alias per il struct
Double
.
In Java, il pugilato è necessario. A causa di cancellazione , non è possibile creare un List<double>
, solo List<Double>
. Al momento della compilazione, List<?>
diventa List<Object>
e la boxe / unboxing dovrà avvenire in modo da poter aggiungere una variabile di tipo nativo di un List<Object>
o assegnare una variabile nativo ad un elemento della lista.
Altri suggerimenti
In C #, double
e Double
sono esattamente la stessa cosa (a patto che non si è creato il proprio tipo di chiamata Double
, che sarebbe stupido).
double
è definito come alias per global::System.Double
. Come tale, non c'è la boxe qui.
In Java, Double
è un double
scatolato, con il tipo-cancellazione essendo una parte fondamentale dell'implementazione generici.