Java面向对象编程(OOP):在实现抽象方法时出错。

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();
    }
}

以下是错误信息:

The type --- 必须实现继承的抽象方法 ---.insert(Object) userDAO.java

基本上,它告诉我没有实现任何名为“insert”的方法,并接收一个对象作为参数。我的模型“User”不算作一个对象吗?我在这里做错了什么?

谢谢您的关注。

附:Eclipse上开发Android应用时出现的错误消息(我不知道是否有所改变)。

6个回答

3

看一下这些方法的签名:

void insert(Object obj);

并且。
void insert(User u)

这两者不是同一个东西,因此你没有履行合同。


返回翻译后的文本:true 但用户也是对象。 - DarthVader
但并不是每个对象都是用户。;] - mre

2
方法签名必须完全匹配。这包括方法名称(ok),返回类型(ok)和参数类型(不ok)。无论 User 必须继承自 Object,它们都需要明确地是相同的类型。想一想 - 否则,某人可能会使用不是 UserObject 调用您的方法,那么子类就无法知道如何处理该参数。如果您只希望有人使用 User 对象调用您的方法,并且使用任何其他类型将导致错误,则可以执行以下操作:
public void insert(Object o) {
    if(o instanceof User) {
        //Normal behaviour
    }
    else {
        throw new RuntimeException("Object must be of type user!");
    }
 }

1
谢谢你的 instanceof 提示。 - Marco Aurélio Deleu

1

您的方法签名不正确,基类和派生类方法使用不同的对象。让我来解释一下:

假设您有一个名为 Base 的类,在其中的一个方法(例如 m1)中接收另一个类 B1 的实例作为参数。同时假设您有一个名为 Derived1 的派生类,它使用参数 D1 来 覆盖 Base 中的方法(m1),还有一个名为 Derived2 的派生类,它使用参数 D2 来覆盖基类方法。

无论是 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规范)。

我不得不读了四遍,但我明白你的意思了。太棒了。谢谢。 - Marco Aurélio Deleu
很抱歉没有详细说明,但很高兴它对你有帮助。 - Shankar Raju
不使用冗长的语言是无法谈论这些概念的。非常出色的解释,谢谢。 - Marco Aurélio Deleu

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
    }
}

0

覆盖方法必须具有头文件public void insert(Object obj)(例如:尝试覆盖类的equals方法)。您始终可以在方法体内转换参数。


0
这是因为您的抽象方法insert有一个Object类型的参数,在Java中它归结为java.lang.Object,而您尝试实现该方法时却提供了一个User类型作为参数。您的抽象方法应该使用泛型类型。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接