2010-06-24 48 views
3

兩類:整型refrence字符串類型值

public class BaseDo<K> { 
    protected K id; 

    public K getId() { 
     return id; 
    } 

    public void setId(K id) { 
     this.id = id; 
    } 
} 


public class BeanDo extends BaseDo<Integer> { 
    private String beanName; 

    public String getBeanName() { 
     return beanName; 
    } 

    public void setBeanName(String beanName) { 
     this.beanName = beanName; 
    } 
} 

我想用反映implment這樣的:

BeanDo beanDo = new BeanDo(); 
beanDo.setId("string here"); 

整型參考字符串類型值。 誰能幫幫我?

+4

你爲什麼要這麼做? – SLaks 2010-06-24 03:10:48

+0

所以你想能夠設置一個整數字符串?爲什麼不擴展'BaseDo '? – 2010-06-24 03:14:58

+0

@SLasks,在我看來,對於現有的一段代碼,他具有一個BeanDo'的具體實例,並且由於id是一個字符串而具有唯一的事物。也許,因爲它是一個int,但有人認爲它會很有趣,如果他們在字符串中添加一個額外的標識符:'12345-N'(N表示正常)... OMG我想我已經在過去......:-S:-S – OscarRyz 2010-06-24 03:23:57

回答

0

像這樣的東西?

public class BaseDo<K> { 

    protected K id; 

    public K getId() { 
    return id; 
    } 

    public void setId(K id) { 
    this.id = id; 
    } 

} 

public class BeanDo extends BaseDo<Integer> { 

    private String beanName; 

    public void setId(String id) { 
    setId(Integer.parseInt(id)); 
    } 

    public String getBeanName() { 
    return beanName; 
    } 

    public void setBeanName(String beanName) { 
    this.beanName = beanName; 
    } 

} 

現在你可以使用這樣的事情:

BeanDo beanDo = new BeanDo(); 
beanDo.setId("2"); 
+0

-1試一下:'beanDo.setId(「string here」);''使用'someString.hashCode()'是所有需要的,請參閱我的答案。 – OscarRyz 2010-06-24 03:26:51

+0

@rmarimon至少讓我對你的downvote發表評論。 – OscarRyz 2010-06-24 03:36:55

0

這個怎麼樣:

BeanDo beando = new BeanDo(); 
beando.setId("string there".hashCode()); 

我不太讓你的意思與「我想用反映實施這個「雖然。

我想你想是這樣的:

BeanDo doer = ... // get it from somewhere 
    String id = ... // get it from somewhere else too. 

    // and you want to set id to the doer bean. 
    reflectionMagicSetId(doer, id); 

而且有這樣的方法:

private void reflectionMagicSetId(BandDo doer, String id) { 
     /// do some magic here? 
} 

如果這就是你想要什麼,我給你完美的作品。

private void reflectionMagicSetId(BandDo doer, String id) { 
    doer.setId(id == null ? 0 : id.hashCode() ); 
} 
+0

使用String.hashCode()似乎不太合適,因爲多個字符串可以產生相同的散列值。例如,如果將它用作數據庫中的主鍵,則這不起作用。 也許tidus2005想用一個整數和一個字符串來創建一個複合鍵?不可能從問題中知道。 – 2010-06-25 14:21:46

+0

好點我猜剩下的唯一資源是子類 – OscarRyz 2010-06-25 15:53:43

0

如果WANN使用整數然後解析字符串爲整數,因爲它會包含整數和使用調用函數的參數是整數的Java

1

泛型在運行時都沒有用,所以就java運行庫會擔心你的ID字段是Object類型,因此可以將其設置爲任何值,而不考慮泛型。這就是說,這樣做是一個壞主意,因爲假設通用合同會失敗。

您可以通過反射設置如下領域:

BeanDo beanDo = new BeanDo(); 
Method method = BeanDo.getClass().getMethod("setId", Object.class); 
method.invoke(beanDo, "SomeRandomString"); 

那說,這樣做是extreamly壞主意,因爲任何代碼編譯反對BeanDo將假設id爲整數,而不是字符串。因此,像beanDo.getId()之類的任何代碼都會因類轉換異常而失敗,因爲它實際上並不是一個整數。

和其他海報一樣,我對你試圖達到的目標有點不知所措。

+0

我同意這一點 - 僅僅因爲你可以並不意味着你應該。如果您無法訪問getId()被調用的每個地方,則不能保證您以後不會爲自己設置問題。如果你有權訪問所有的用途,你應該改變對象以明確使用一個字符串。 – Curtis 2010-07-02 11:30:40

0

它似乎是一個可以設置字符串的唯一方法的子類,但仍然保證任何已經調用getId()的人都可以獲得他們期望的Integer。事情是這樣的:

 
public class StringBeanDo extends BeanDo { 
    private String stringId; 

    public String getStringId() 
    { 
    return stringId; 
    } 

    public void setId(Integer val) 
    { 
    super.setId(val); 
    stringId = Integer.toString(val); 
    } 

    public void setId(String str) 
    { 
    stringId = str; 
    super.setId(convertStringToInteger(str)); // Do this however you like. 
    } 
} 

convertStringToInteger的實施將取決於你(這將取決於什麼是用於此ID)。這裏的關鍵是你要維護兩個ID,並保持它們同步,以便舊的代碼在一定程度上仍然可以跛行。