OOP Java。尝试实现抽象方法时出错

时间:2012-09-05 00:26:52

标签: java oop polymorphism

所以,这是我抽象类的一部分:

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

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

感谢您的关注。

Ps.:开发Android应用程序时Eclipse上的错误消息(我不知道它是否会发生任何变化)。

6 个答案:

答案 0 :(得分:3)

查看方法签名,

void insert(Object obj);

void insert(User u)

不一样,所以你没有履行合同。

答案 1 :(得分:2)

方法签名必须与完全匹配。这包括方法名称(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!");
    }
 }

答案 2 :(得分: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
    }
}

答案 3 :(得分:1)

您的方法签名不正确,基本和派生方法采用不同的对象。让我试着解释一下:

假设你有一个类Base,它在其一个方法(比如m1)中获取另一个类B1的实例。还假设您有一个Derived类Derived1,其中覆盖 Base中的方法(m1),参数为D1,类似地,派生类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规范)

答案 4 :(得分:0)

重写方法必须包含标头public void insert(Object obj)(例如:尝试覆盖类的equals方法)。您始终可以在方法体中强制转换参数。

答案 5 :(得分:0)

这是因为你的抽象方法插入有一个Object类型的参数,归结为java.lang.Object,你实现该方法的尝试有一个User类型作为参数提供。您的抽象方法应使用泛型类型