2016-03-16 54 views
0

是否有可能發送任何類型的輸入到一個方法,並找到類型時做類型的操作通過?是否有可能將任何類型的輸入傳遞給方法並確定給定的輸入類型?

like 

public methodName(int value){....} 

,而不是這個

public methodName(anyType anValue){....} 

我用java 8.

+0

你是指重載方法?在這種情況下,您可以根據最終調用的方法隱式知道輸入參數的類型。 –

+0

您可以將參數設置爲Object並查看整數或字符串或任何其他類型。 –

+1

這非常含糊。你想達到什麼目的?答案可能是重載方法,使用泛型,使用反射或其他。 –

回答

4

「最佳」 你能做的就是傳遞一個Object。然後,您可以檢查它,找出它是什麼(除非它是null,那麼你不知道它應該是什麼,如果這是重要的)。

if (theObject instanceof String){ 
    // do something 
} else if (theObject instanceof Number){ 
    // do something 
} 

但是這有點失敗了強類型語言的目的,而且很少適合。

您也正在丟失任何通用類型信息(因爲它在運行時被擦除並且只能在編譯時使用)。

作爲替代方案,考慮使用不同的參數類型提供方法的多重載。

1

是的,你可以通過泛型編程來完成。有關如何在Java中使用泛型編程的更多信息,請參見here

+0

這個答案不正確。除少數例外情況外,所有Java版本(直到版本8)的正式通用參數的類型僅在編譯時纔可知。在編譯爲字節碼期間,泛型類型信息被擦除,使得運行時代碼很難確定參數的正式類型是什麼。 – scottb

1

你可以使用一個通用的方法,像

public static <T> void exampleMethod(T obj) { 
    System.out.printf("%s %s%n", obj.getClass().getName(), obj); 
} 

那麼你可以傳遞任何Object類型exampleMethod(或原始與自動裝箱)。作爲一個例子,

public static void main(String args[]) { 
    exampleMethod("Hello"); 
    exampleMethod(123); 
    exampleMethod(123.123f); 
} 

其輸出

java.lang.String Hello 
java.lang.Integer 123 
java.lang.Float 123.123 
+0

沒有'T'被引用到任何地方或被約束,這是否比使用Object obj有優勢? – Thilo

+0

@Thilo:編譯器確保泛型類型的類型安全。 Object obj'可以包含任何類型,因此可能不是類型安全的。 – scottb

+0

@scottb:編譯器保證無約束的「T」不會被引用到其他任何地方? – Thilo

1

可以利用的instanceof

public void methodName(Object value){ 
     if(value instanceof Integer){ 

     }else if(value instanceof String){ 

     } 

} 
相關問題