2

この質問をするのはばかげていると思いますが、実際には問題がわかりません。それをコンパイルすると ClassCastException が発生しました

これがスーパークラス

package elements;
import persistence.postgres.DataSource;
import persistence.postgres.IdBroker;
import persistence.postgres.PersistenceException;
import util.Util;

public class Hotspot {
private double lat;
private double lng;
private long id;
private String username;
private String time_stamp;
private String point_of_interest;
private String comment;

public Hotspot(double lat, double lng, String username, String comment, String p_o_i) {
    this.lat = lat;
    this.lng = lng;
    this.username = username;
    try {
        this.id = IdBroker.getId(new DataSource().getConnection());
    } catch (PersistenceException e) {
        e.printStackTrace();
    }
    time_stamp = Util.timeStamp();
    this.comment = comment;
    this.point_of_interest = p_o_i;
}

public Hotspot(double lat, double lng, String username, long id,  String time_stamp) {
    this.lat = lat;
    this.lng = lng;
    this.username = username;
    this.id = id;
    this.time_stamp = time_stamp;
}

//Getter Setter for all variable and HashCode/Equals

}

そして、これはサブコールです

package persistence.postgres;

import elements.Details;
import elements.Hotspot;

public class HotspotProxy extends Hotspot {
private HotSpotDAOpostgres hsd;
private Details details;

//insert
public HotspotProxy(double lat, double lng, String username, String comment, String poi) {
    super(lat, lng, username, comment, poi);
    this.hsd = new HotSpotDAOpostgres();
}

//Retrieve
public HotspotProxy(double lat, double lng, String username, long id, String time_stamp) {
    super(lat, lng, username, id, time_stamp);
    this.hsd = new HotSpotDAOpostgres();
}

public String getPointOfInterest() {
    redifined method
}

public String getComment() {
        //redifined method
}
}

そして、これは私にエラーを与えます

Hotspot h = new Hotspot(31.124, 43.123, "name", "comment", "point of interest");
HotspotProxy hp = (HotspotProxy)h;

どこで失敗しているか教えてください。提案をありがとう

4

6 に答える 6

7
Hotspot      := Animal
HotspotProxy := Dog

aDogを an に(特殊から一般に、つまりサブクラスから基底クラスに) キャストできますが、Animalその逆 (一般から特殊に、つまり基底クラスからサブクラスに) はできません。すべてが であるとは限りません。DogAnimalAnimalDog

あなたが何かを持っていたら

Animal a = new Dog();

その場合、次のことが許可されます。

Dog d = (Dog) a;

なぜならa、実際にはDog.

于 2013-06-09T17:06:57.043 に答える
2

スーパークラスのインスタンス をサブクラスにキャストすることはできません。

そうです、それHotspotProxyHotspotですが、すべて Hotspotの s がHotspotProxys であるとは限りません。

これはコンパイル エラーではないことに注意してください。実行時エラーです。これは、キャスト (明示的なキャスト!) を実行したためです。したがって、基本的には、自分が何をしているのかを知っていることを信頼するようにコンパイラーに指示しましたが、.. そうではありません。そのため、コンパイラは「OK、コンパイルします。彼は何をしているのか知っています」と言うでしょうが、プログラムを実行すると実行時エラーが発生します。

(キャストを削除すると、実際にコンパイル エラーが発生します)。

于 2013-06-09T17:07:19.363 に答える
1

オブジェクト変数が実際には、変数が何であれサブクラスのインスタンスである場合があります。たとえば、

Hotspot h = new HotspotProxy(...)

なぜなら、 aHotspotProxyは aHotspotです。その場合、ブール値(h instanceof HotspotProxy)は になりますtrue。ただし、あなたの場合、h変数はHotspotそう(h instanceof HotspotProxy)falseあり、キャストは失敗します。

于 2013-06-09T17:12:57.147 に答える
1

これは、スーパー クラス オブジェクトをサブ クラスにキャストしようとしているためです。

Hotspot h = new Hotspot(31.124, 43.123, "name", "comment", "point of interest");
HotspotProxy hp = (HotspotProxy)h;

h2 番目のステートメントで型強制を実行し、それが実際にobjectであるとコンパイラに信じ込ませましたHotspotProxyHotspot hサブクラスの任意のオブジェクトを参照できるため、コンパイラはこれを許可します。したがって、前の行がであった場合Hotspot h = new HotspotProxy()、このキャストは成功したはずです。しかし、実行時に JVM は、コンパイラの信頼に違反していることを発見しh、オブジェクトでHotspotはなくHotspotProxy、例外をスローします。

于 2013-06-09T17:08:39.690 に答える
0

HotSpot が hostspotproxy のインスタンスであるかどうかを最初に確認します

if(h instanceof HotspotProxy)
HotspotProxy hp = (HotspotProxy)h;
于 2013-06-09T17:16:57.350 に答える
0

使用している参照変数が実際にサブクラス オブジェクトを指している場合は、ダウンキャストできます。たとえば、Dog クラスが Animal クラスを拡張するとします。

それで

Animal a = new Dog();
Animal b = new Animal();

Dog d1=(Dog)a; //this works
Dog d2=(Dog)b; //this fails at run time

このようにキャストすると、コンパイラーは私たちを信頼します。オブジェクトが同じ継承階層に属していることだけが保証されます。したがって、これは正常にコンパイルされます。しかし、ここでの 2 番目のケースでは、あなたのケースと同様に、ClassCastException がスローされます。

このようなエラーを防ぐために、ダウンキャストする前にコードをチェックできます。

if(HotSpot1 instanceof HotSpotProxy)
{
 HotSpotProxy hsp= (HotSpotProxy) HotSpot1;
}
于 2013-06-09T17:35:56.207 に答える