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

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

感谢您的关注。

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

4

6 回答 6

3

查看方法签名,

void insert(Object obj);

void insert(User u)

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

于 2012-09-05T00:28:41.843 回答
2

方法签名必须完全匹配。这包括方法名(ok)、返回类型(ok)和参数类型(not ok)。

User必须继承自没关系Object,它们都明确需要是相同的类型。想一想 - 否则有人可以用Object不是 a来调用您的方法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

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

假设您有一个类 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 规范)

于 2012-09-05T00:38:53.877 回答
0

覆盖方法必须有标题public void insert(Object obj)(例如:尝试覆盖equals类的方法)。您始终可以在方法主体中转换您的论点。

于 2012-09-05T00:31:53.467 回答
0

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

于 2012-09-05T00:33:42.160 回答