0

我有一个模型抽象类,我想有一个抽象方法来设置模型实例的 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";
    }
}
4

2 回答 2

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;
    }
}
于 2013-05-31T02:48:49.723 回答
1

您绝对可以使用多个泛型,请参阅泛型类型教程了解更多信息。最佳实践是使用单个大写字母来表示泛型类型,因为它们(应该)与实际定义的类型形成鲜明对比。但是(如果我正确理解文档)您可以在定义类时使用任何有效的、未使用的类型名称作为泛型类型。

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";
    }
}
于 2013-05-31T03:21:50.977 回答