3

だから、これが私の抽象クラスの一部です:

abstract public void insert(Object obj);

そして、これを拡張するクラスの実装は次のとおりです。

public void insert(User u){
    try{
        String sql = "INSERT INTO " + TABLE + " (username, assword) VALUES ("+u.getUsername()+", " +u.getPassword()+")";
        conn.execSQL(sql);
    }catch(Exception e){
        System.out.println(e.getMessage());
    }finally{
        conn.close();
    }
}

エラーは次のとおりです。

タイプ---継承された抽象メソッドを実装する必要があります---。insert(Object)userDAO.java

基本的には、「挿入」と呼ばれるオブジェクトをパラメータとして受け取るメソッドを実装しなかったと言っています。モデルの「ユーザー」はオブジェクトとしてカウントされませんか?私はここで何が間違っているのですか?

ご清聴ありがとうございました。

追伸:Androidアプリの開発中のEclipseでのエラーメッセージ(何かが変わるかどうかはわかりません)。

4

6 に答える 6

3

メソッドのシグネチャを見てください。

void insert(Object obj);

void insert(User u)

同じではないので、あなたは契約を履行していません。

于 2012-09-05T00:28:41.843 に答える
2

メソッドシグネチャは完全に一致する必要があります。これには、メソッド名(ok)、戻り型(ok)、およびパラメーター型(okではない)が含まれます。

Userから継承する必要があるかどうかは関係ありませんObject。両方とも明示的に同じタイプである必要があります。考えてみてください。そうしないと、誰かがObjectではないを使用してメソッドを呼び出す可能性があります。そうしないUserと、サブクラスはそのパラメーターの処理方法を知る方法がありません。

オブジェクトを使用してメソッドを呼び出すだけUserで、他のタイプを使用してメソッドを呼び出すとエラーが発生する場合は、次のようにします。

public void insert(Object o) {
    if(o instanceof User) {
        //Normal behaviour
    }
    else {
        throw new RuntimeException("Object must be of type user!");
    }
 }
于 2012-09-05T00:31:22.797 に答える
1

明らかに、メソッドのシグネチャは同じではありません。抽象メソッドはを取りますObjectが、実装はを取りますUser

ただし、このようなパターンを実装する場合は、ジェネリックスを試してください。

public abstract class MyAbstractClass<T> {

    abstract public void insert(T t);

}


public class MyImpl extends MyAbstractClass<User> {

    public void insert(User t) {
        // compiles OK
    }
}
于 2012-09-05T00:35:59.300 に答える
1

メソッドのシグネチャが正しくありません。ベースメソッドと派生メソッドは異なるオブジェクトを取ります。説明してみましょう:

メソッドの1つ(たとえばm1)で別のクラスB1のインスタンスを取得するクラスBaseがあるとします。また、Baseのメソッド(m1)をパラメーターD1でオーバーライドするDerivedクラスDerived1と、同様に、基本メソッドをパラメーターD2でオーバーライドする派生クラスDerived2があるとします。

D1とD2の両方がB1を実装/拡張します。これは、次のシナリオのために問題になります。

Base baseObj = new Derived1();
baseObj.m1(new D2()); // Should work if it is allowed to override a method in your way!

上記のコードスニペットは、Derived1のm1メソッドがタイプD1のパラメーターを予期しているため失敗しますが、D2を取得しました。このタイプのパラメーターのキャストが許可されていない理由がわかりますか?

注:ベースのメソッドをオーバーライドする場合は、@ overrideアノテーションを使用することをお勧めします(Java 1.5仕様から)

于 2012-09-05T00:38:53.877 に答える
0

オーバーライドするメソッドにはヘッダーが必要public void insert(Object obj)です(例:equalsクラスのメソッドをオーバーライドしてみてください)。メソッド本体内でいつでも引数をキャストできます。

于 2012-09-05T00:31:53.467 に答える
0

これは、抽象メソッドの挿入にObject型のパラメーターがあり、これはjava.lang.Objectに要約され、メソッドを実装しようとすると、パラメーターとしてUser型が指定されるためです。抽象メソッドはジェネリック型を使用する必要があります

于 2012-09-05T00:33:42.160 に答える