2011-08-28 35 views
1

我的計算機上有一個程序模擬互聯網上的服務器,假服務器需要能夠向某些類發送多個數據類型。例如,在程序的一個點上,服務器需要將一個int發送給一個類,然後將該int轉換爲一個字符串並將其發送給另一個。如何讓方法具有不同的輸入類型java

基本上我問的是,如果一個方法可以有多個數據類型的輸入(這是否有意義?如果沒有生病嘗試解釋更好)。有沒有辦法做到這一點,而不創建許多不同的方法?

編輯:也就是有沒有辦法告訴傳入的類型之間的差異(以防止錯誤)

+0

您能張貼一些示例代碼嗎? –

回答

2

如果我理解正確的叫,你問如果一個方法foo()可以有多個不同的輸入,其參數

這樣foo(Integer i)foo(String s)被包圍以同樣的方法。

答案:是的,但它不是漂亮

foo(Object o)

是您的方法聲明

現在,你需要理清不同類型的可能性

if(o instanceof Integer){ 
    stuff(); 
} else if (o instanceof String){ 
    moreStuff(); 
} 

剛剛鏈其他/ if語句爲期望的結果。

3

你可以擁有這需要Object這是任何類型的方法。在Java 5.0和更高版本中,原語將被自動裝箱並作爲對象傳遞。

void method(Object o); 

可以使用

method(1); 
method("hello world"); 
method(new MyClass()); 
method(null); 
+0

好..可能是他想要的。但是重載方法更簡單,因爲在任何情況下,他都應該使用instanceof對方法進行多重檢查。 – Heisenbug

+0

這可能是這種情況,但這取決於OP對該對象所做的事情。如果它的'toString()'或'ObjectOutputStream.writeObject()'沒有關係。 –

+0

+1:是的,你說得對。我刪除了我的答案。 – Heisenbug

0

你想要的是通用方法或類。 檢查的對象是你必須使用「的instanceof」方法

你可以讓整個類通用或只是一個單一的方法,一個泛型類的例子是什麼類型:

package javahowto; 
public class Member<T> { 
private T id; 
public Member(T id) { 
    this.id = id; 
} 
public T getId() { 
    return id; 
} 
public void setId(T id) { 
    this.id = id; 
} 
public static void main(String[] args) { 
    Member<String> mString = new Member<String>("id1"); 
    mString.setId("id2"); 
    System.out.printf("id after setting id: %s%n", mString.getId()); 
    //output: id after setting id: id2 

    Member<Integer> mInteger = new Member<Integer>(1); 
    mInteger.setId(2); 
    System.out.printf("id after setting id: %d%n", mInteger.getId()); 
    //output: id after setting id: 2 
} 

現在你現在要找什麼,我相信你會找到你的問題的最佳解決方案。

退房: http://download.oracle.com/javase/tutorial/java/generics/index.html http://en.wikipedia.org/wiki/Generics_in_Java

...

0

嗯,我也想知道以下塊寫道。我認爲instanceof更好,但我試過getclass。

公共靜態無效的主要(字串[] args){

System.out.println(method("This is a test")); 
} 


private static String method(Object o){ 
      System.out.println(o.toString()); 
    String status = ""; 
    String className; 
    String[] oList = {"Double","Integer","String","Double","Float","Byte","Short","Long","Character","Boolean" }; 

    for(int i = 0;i<oList.length;i++){ 

     className = "java.lang." + oList[i]; 
     Class testClass; 
     try { 
      testClass = Class.forName(className); 
      if(o.getClass().equals(testClass)){ 

       status = "Your object is " + oList[i]; 


      } 
     } catch (ClassNotFoundException e) { 

      e.printStackTrace(); 
     } 

    } 


    return status; 

} 
0

您可以使用 「散列適配器」 的格局。

Public interface Adapter { 
    Public void handle(object o); 
} 

Public class StringAdapter implements Adapter { 
    Public void handle(String st) { // stuff ... 
} 

Public class IntegerAdapter implements Adapter { 
    Public void handle(Integer intgr) { // stuff ... 
} 

Private static final Map adapters = new HashMap(); 
Adapters.put(string.class, new stringAdapter()); 
Adapters.put(Integer.class, new IntegerAdapter()); 

Public void handleMe(Object o) { 
    Adapters.get(o.getClass()).handle(o); 
} 

我一直喜歡這個比ol級聯的ifs和else's更多。

在我的iPad上對格式化和簡潔以及拼寫感到抱歉。

相關問題