所以,这是我抽象类的一部分:
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上的错误消息(我不知道它是否会发生任何变化)。
答案 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类型作为参数提供。您的抽象方法应使用泛型类型