我有一个Model抽象类,我希望有一个抽象方法来设置模型实例的id。我希望实现能够定义他们想要用于id对象的对象。在下面的示例中,getId()工作正常但我无法覆盖setId()方法,因为签名不相同:setId(Object id)vs setId(Integer id)。我可以使用<完成此操作吗? T>或者< E>或者是其他东西。我不熟悉如何使用它们。
abstract class Model{
abstract public void setId(Object id); <-- the problem
abstract public Object getId();
}
class SQLiteModel extends Model{
private Integer id;
@Override
public void setId(Integer id){ <-- the problem
this.id = id;
}
@Override
public Integer getId(){
return id;
}
}
那么多个泛型呢?
abstract class Model<T> {
abstract public void setId(T id);
abstract public T getId();
abstract public T getSomethingElse();
}
class SQLiteModel extends Model<Integer> {
private Integer id;
@Override
public void setId(Integer id) {
this.id = id;
}
@Override
public Integer getId() {
return id;
}
@Override
public String getSomethingElse(){
return "a string";
}
}
答案 0 :(得分:2)
制作模型通用
abstract class Model<T> {
abstract public void setId(T id);
abstract public T getId();
}
class SQLiteModel extends Model<Integer> {
private Integer id;
@Override
public void setId(Integer id) {
this.id = id;
}
@Override
public Integer getId() {
return id;
}
}
答案 1 :(得分:1)
您绝对可以使用多个泛型,请参阅generic types tutorial了解更多信息。最佳做法是使用单个大写字母来表示泛型类型,因为它们(应该)与实际定义的类型形成鲜明对比。但是(如果我理解正确的文档),您可以在定义类时使用任何有效的,未使用的类型名称作为泛型类型。
abstract class Model<T, V> {
abstract public void setId(T id);
abstract public T getId();
abstract public V getSomethingElse();
}
class SQLiteModel extends Model<Integer, String> {
private Integer id;
@Override
public void setId(Integer id) {
this.id = id;
}
@Override
public Integer getId() {
return id;
}
@Override
public String getSomethingElse(){
return "a string";
}
}