2013-05-31 95 views
0

我有一個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

品牌型號通用

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; 
    } 
} 
+0

真棒。我從來沒有理解泛型。絕對需要閱讀如何使用它們。謝謝 – David

+0

如果我想讓SQLiteModel實現另一個對象,該怎麼辦?你如何允許多種泛型? – David

+0

你可以創建另一個類,例如類SQLiteStringModel extends 0123b{... –

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