在抽象方法的签名中省略对象类型

时间:2013-05-31 02:40:26

标签: java

我有一个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";
    }
}

2 个答案:

答案 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";
    }
}