Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
byte[] b = {'a', 'b', 'c'};
short[] s = new short[3];
s=b;
1. Frage: Warum kann man in ein byte-Feld char-Werte (das sind doch char-Werte oder?) speichern?
2. Frage: s=b lässt sich nicht compilieren, da angeblich eine Referenz auf ein byte-Feld nicht in einer short-Variablen gespeichert werden kann. Aber bisher hab ich es so gelernt, dass byte sich implizit in ein short umwandeln lässt (siehe unten). Wie lässt sich das erklären?
Beim Erzeugen eines Arrays mit Initialisierung seiner Elemente wie in deinem Fall mit dem Array `b` prüft der Compiler für jeden Wert in dem Array, ob es sich durch den Elementtyp des Arrays darstellen lässt. Die Zeichen 'a', 'b' und 'c' fallen alle in den Bereich eines byte (ASCII), somit meckert er hier nicht rum.
Anders sieht es zum Beispiel aus bei:
Java:
byte[] arr = {'2', 'π'};
Das PI Zeichen ist kein ASCII Zeichen und somit kann es nicht als byte dargestellt werden.
Anderes Beispiel:
Java:
byte[] arr2 = {2, 127}; // <- geht
byte[] arr3 = {2, 128}; // <- geht nicht!
Es ist zwar richtig, dass ein byte zu einer short Variablen zugewiesen werden kann, aber das gilt nicht für Arrays. Ein byte[] ist nicht zuweisungskompatibel zu einem short[].
Wenn man mal darüber nachdenkt, macht das ja auch Sinn. Arrays sind Referenztypen in Java. Wenn eine Zuweisung also funktionieren _würde_, dann würden beide Arrays mit unterschiedlicher Elementweite ja auf denselben Speicher zeigen und das Schreiben in das short[] Array würde dann zwei Bytes imselben byte[] Array verändern. Sowas geht wohl in C aber nicht in Java.
public class cast {
public static void main(String[] args) {
byte[] b = {'a','b','c',(byte)0xfc}; // (byte Typenumwandlung)0xfc Hexadezimalwert oder 252
short[] s = new short[4];
s[0] = (short )b[0]; // Einzelne Feldwerte könne nach einem cast, Typenumwahlung zugewiesen werden.
for (int i=1; i<s.length; i++) //Oder in einer for-Schleife für fast alle Feldwerte.
s[i] = (short)b[i];
System.out.printf("%d %d %d %d",s[0],s[1],s[2],s[3]);
}
}
//97 98 99 -4