Frage

las ich einige Artikel über „Classcast“ geschrieben, aber ich konnte nicht eine gute Idee, auf das bekommen. Gibt es einen guten Artikel oder was wäre eine kurze Erklärung sein?

War es hilfreich?

Lösung

Gerade von den API-Spezifikationen für die ClassCastException :

  

Geworfen, um anzuzeigen, dass der Code   versucht, ein Objekt zu einem werfen   Unterklasse von denen es nicht ist   Beispiel.

So zum Beispiel, wenn man eine Integer zu einem String zu werfen versucht, String ist keine Unterklasse von Integer, so wird ein ClassCastException geworfen werden.

Object i = Integer.valueOf(42);
String s = (String)i;            // ClassCastException thrown here.

Andere Tipps

Es ist wirklich ziemlich einfach: Wenn Sie ein Objekt der Klasse A in ein Objekt der Klasse B typisieren versuchen, und sie sind nicht kompatibel, eine Klasse Guss Ausnahme erhalten

.

Denken wir an eine Sammlung von Klassen.

class A {...}
class B extends A {...}
class C extends A {...}
  1. Sie können alle diese Dinge zu gieße Objekt, weil alle Java-Klassen von Object erben.
  2. Sie können entweder B oder C nach A gegossen, weil sie beide „Arten von“ A
  3. sind
  4. Sie können einen Verweis auf eine Besetzung ein Objekt B nur, wenn das reale Objekt ist ein B.
  5. Sie können keine B zu einem C gegossen, obwohl sie beide eine der sind.

Es ist eine Ausnahme, die auftritt, wenn Sie eine Klasse niedergeschlagenen Versuch, aber in Wirklichkeit ist die Klasse nicht von dieser Art.

Betrachten Sie diese Hierarchie:

  

Object -> Animal -> Hund

Sie haben vielleicht eine Methode aufgerufen:

 public void manipulate(Object o) {
     Dog d = (Dog) o;
 }

Wenn mit diesem Code aufgerufen:

 Animal a = new Animal();
 manipulate(a);

Es wird kompilieren ganz gut, aber zur Laufzeit erhalten Sie eine ClassCastException bekommen, weil o in der Tat war ein Tier, kein Hund.

In späteren Versionen von Java Sie tun, um eine Compiler-Warnung erhalten, es sei denn, Sie tun:

 Dog d;
 if(o instanceof Dog) {
     d = (Dog) o;
 } else {
     //what you need to do if not
 }

Beispiel betrachten,

class Animal {
    public void eat(String str) {
        System.out.println("Eating for grass");
    }
}

class Goat extends Animal {
    public void eat(String str) {
        System.out.println("blank");
    }
}

class Another extends Goat{
  public void eat(String str) {
        System.out.println("another");
  }
}

public class InheritanceSample {
    public static void main(String[] args) {
        Animal a = new Animal();
        Another t5 = (Another) new Goat();
    }
}

Bei Another t5 = (Another) new Goat(): Sie werden eine ClassCastException bekommen, weil Sie nicht eine Instanz der Klasse Another erstellen können mit Goat.

Hinweis . Die Umwandlung ist nur gültig, in Fällen, in denen eine Klasse eine Elternklasse und die untergeordnete Klasse zu seiner übergeordneten Klasse gegossen wird erweitert

Wie mit dem ClassCastException umgehen:

  1. Seien Sie vorsichtig, wenn ein Objekt einer Klasse in eine andere Klasse zu werfen versuchen. Stellen Sie sicher, dass der neue Typ gehört zu einem seiner übergeordneten Klassen.
  2. Sie können den Classcast verhindern durch die Verwendung von Generika, weil Generics Zeit prüft kompilieren liefern und kann verwendet werden, typsichere Anwendungen zu entwickeln.

Quelle der Note und Rest

Sie versuchen, ein Objekt als Instanz einer Klasse zu behandeln, die es nicht ist. Es ist in etwa analog zu versuchen, das Dämpferpedal auf einer Gitarre (Klaviere haben Dämpferpedale, Gitarren nicht) zu drücken.

Verstehen Sie das Konzept des Casting? Casting ist der Prozess der Typumwandlung, die in Java ist sehr verbreitet, weil es ist eine statisch typisierte Sprache. Einige Beispiele:

Guss den String "1" in einem int -> kein Problem

Guss die Zeichenfolge "abc" in einem int -> wirft eine Classcast

Oder denken Sie an ein Klassendiagramm mit Animal.class, Dog.class und Cat.class

Animal a = new Dog();
Dog d = (Dog) a; // No problem, the type animal can be casted to a dog, because its a dog.
Cat c = (Dog) a; // Raises class cast exception; you can't cast a dog to a cat.

Eine Klasse Guss Ausnahme von Java wird ausgelöst, wenn Sie versuchen, ein Objekt von einem Datentyp in einen anderen zu werfen.

Java ermöglicht es uns, Variablen von einem Typ zum anderen so lange zu werfen, wie das Gießen zwischen kompatiblen Datentypen geschieht.

Zum Beispiel können Sie einen String als Objekt gegossen und in ähnlicher Weise ein Objekt, das String-Werte enthält, kann in einen String umgewandelt werden.

Beispiel

Nehmen wir an, wir eine HashMap haben, die eine Anzahl von Arraylist-Objekte enthält.

Wenn wir schreiben Code wie folgt:

String obj = (String) hmp.get(key);

wäre es eine Klasse Guss Ausnahme auslösen, da der Wert von der get-Methode der Hash-Karte zurückgegeben würde eine Array-Liste sein, aber wir versuchen, es in einen String zu werfen. Dies würde die Ausnahme verursachen.

Ein sehr gutes Beispiel, das ich Ihnen für Classcast in Java geben kann, wird bei der Verwendung von „Collection“

List list = new ArrayList();
list.add("Java");
list.add(new Integer(5));

for(Object obj:list) {
    String str = (String)obj;
}

Das obige Code wird Ihnen zur Laufzeit Classcast. Weil Sie versuchen Integer in String zu werfen, das wird die Ausnahme aus.

Sie können besser verstehen und Gießen Classcast wenn Sie erkennen, dass der JVM nicht die unbekannte erraten. Wenn B eine Instanz von A es mehr Klasse Mitglieder und Methoden auf dem Heap als A. Die JVM kann nicht erraten hat wie A nach B zu werfen, da das Mapping-Ziel größer ist, und die JVM nicht wissen, wie die zusätzlichen Mitglieder zu füllen.

Aber wenn A eine Instanz von B ist, wäre es möglich sein, da A ein Verweis auf eine vollständige Instanz von B ist, so dass die Zuordnung ein Eins-zu-eins sein wird.

Ein Java-Classcast ist eine Ausnahme, die auftreten können, wenn Sie versuchen, unsachgemäß eine Klasse von einem Typ in einen anderen zu umwandeln.

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class ClassCastExceptionExample {

  public ClassCastExceptionExample() {

    List list = new ArrayList();
    list.add("one");
    list.add("two");
    Iterator it = list.iterator();
    while (it.hasNext()) {
        // intentionally throw a ClassCastException by trying to cast a String to an
        // Integer (technically this is casting an Object to an Integer, where the Object 
        // is really a reference to a String:
        Integer i = (Integer)it.next();
    }
  }
 public static void main(String[] args) {
  new ClassCastExceptionExample();
 }
}

Wenn Sie versuchen, dieses Java-Programm ausführen Sie werden sehen, dass es die folgende Classcast werfen:

Exception in thread "main" java.lang.ClassCastException: java.lang.String
at ClassCastExceptionExample  (ClassCastExceptionExample.java:15)
at ClassCastExceptionExample.main  (ClassCastExceptionExample.java:19)

Der Grund, hier eine Ausnahme ausgelöst wird, ist, dass, wenn ich meine Liste Objekt erstellen, das Objekt, das ich in der Liste zu speichern ist der String „one“, aber dann später, wenn ich versuche, dieses Objekt zu erhalten heraus, dass ich absichtlich ein machen Fehler, indem sie versuchen, es zu einem Integer zu werfen. Da ein String kann nicht direkt an einen Integer umgewandelt werden - eine ganze Zahl ist nicht eine Art von String -. Ein Classcast geworfen

Wenn Sie Objekte sortieren möchten, aber wenn Klasse nicht umgesetzt Vergleichbar oder Vergleicher, dann werden Sie bekommen Classcast Zum Beispiel

class Animal{
   int age;
   String type;

   public Animal(int age, String type){
      this.age = age;
      this.type = type;
   }
}
public class MainCls{
   public static void main(String[] args){
       Animal[] arr = {new Animal(2, "Her"), new Animal(3,"Car")};
       Arrays.sort(arr);
   }
}

Vor Hauptmethode unter Laufzeitklasse Guss Ausnahme werfen

  

Exception in thread "main" java.lang.ClassCastException: com.default.Animal kann nicht auf java.lang.Comparable gegossen werden

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top