我們如何識別給定變量的原始數據類型?我們如何識別給定變量的原始數據類型?
回答
你正在嘗試做的事當然只適用於使用反射的工作(並且再次使用Object
)。然後你就可以識別與類型:
field.getType()
或
field.getType().getName()
取決於你是否想要的名稱,或Class
然後你就可以比較Integer.TYPE
,Double.TYPE
等,這是原始Class
表示。
我不認爲你可以。
我的意思是......如果我創建了一個「學生」類型的對象,那麼原語是什麼?沒有意義。
我假設你的意思是Java。答案取決於誰在做這個識別:
如果你是一個PROGRAMMER,並且你在讀代碼,那麼你可以通過向上讀取當前方法尋找變量的聲明來找出變量的類型。如果沒有找到它,請通過當前類查看該名稱的實例變量的聲明。聲明總是給出Java中的類型(與Haskell或Scala不同,它們是強類型的,但是具有良好的類型推斷),所以你永遠不需要再去查看變量聲明。
如果您是編譯器,並且您正在從源代碼生成代碼,那麼您可以按照與程序員相同的方法。此外,你還有一些額外的選擇 - 在許多情況下,你可能會確定變量不會在編譯的代碼塊之外「逃避」,因此你甚至可能永遠不會創建變量......只是保留寄存器中的數據。
如果你是一個執行程序,那麼存在一些定義問題。找到一個變量的類型是沒有意義的 - 變量只是代碼中的標籤,運行時確實存在的是存儲在這些變量中的對象。它是但是,對於某些對象類型,您可能有一些泛型類型的變量,並且想知道實際類型是什麼。 (基本類型,沒有子類,所以這個問題可能永遠不會來了)。例如,你可能有這樣的:
public void someFunc(Animal animal) {
// Here I want to know if 'animal' is a 'Dog' or a 'Cat'
}
在這種情況下,你可以使用的getClass()方法,它存在於所有Java中的對象:
public void someFunc(Animal animal) {
System.out.println("The type of animal is: " + animal.getClass());
}
希望這有助於!
如果OP是一個編譯器或執行程序,我們已經失去了大機器人戰爭:(人類很好,但它持續了,我猜。 – Alex 2011-10-10 15:26:52
我想你沿着這條線
private final static Map<Class<?>, Class<?>> simpleTypes = new Hashtable<Class<?>, Class<?>>();
static {
simpleTypes.put(String.class, String.class);
simpleTypes.put(Boolean.class, Boolean.class);
simpleTypes.put(boolean.class, boolean.class);
simpleTypes.put(Byte.class, Byte.class);
simpleTypes.put(byte.class, byte.class);
simpleTypes.put(Short.class, Short.class);
simpleTypes.put(short.class, short.class);
simpleTypes.put(Integer.class, Integer.class);
simpleTypes.put(int.class, int.class);
simpleTypes.put(Long.class, Long.class);
simpleTypes.put(long.class, long.class);
simpleTypes.put(Float.class, Float.class);
simpleTypes.put(float.class, float.class);
simpleTypes.put(Double.class, Double.class);
simpleTypes.put(double.class, double.class);
simpleTypes.put(Character.class, Character.class);
simpleTypes.put(char.class, char.class);
simpleTypes.put(BigDecimal.class, BigDecimal.class);
simpleTypes.put(StringBuffer.class, StringBuffer.class);
simpleTypes.put(BigInteger.class, BigInteger.class);
simpleTypes.put(Class.class, Class.class);
simpleTypes.put(java.sql.Date.class, java.sql.Date.class);
simpleTypes.put(java.util.Date.class, java.util.Date.class);
simpleTypes.put(Time.class, Time.class);
simpleTypes.put(Timestamp.class, Timestamp.class);
simpleTypes.put(Calendar.class, Calendar.class);
simpleTypes.put(GregorianCalendar.class, GregorianCalendar.class);
simpleTypes.put(URL.class, URL.class);
simpleTypes.put(Object.class, Object.class);
}
public static boolean isSimpleType(final Object object) {
if (object == null) { return false; }
return isSimpleType(object.getClass());
}
public static boolean isSimpleType(final Class<?> clazz) {
if (clazz == null) { return false; }
return simpleTypes.containsKey(clazz);
}
public static boolean isMapType(final Class<?> clazz) {
boolean lvReturn = false;
if (clazz != null) {
lvReturn = (Map.class.isAssignableFrom(clazz));
}
return lvReturn;
}
public static boolean isMapType(final Object object) {
boolean lvReturn = false;
if (object == null) {
lvReturn = false;
}
else if (object instanceof Map) {
lvReturn = true;
}
return lvReturn;
}
public static boolean isCollection(final Object object) {
boolean lvReturn = false;
if (object == null) {
lvReturn = false;
}else{
lvReturn=isCollection(object.getClass());
}
return lvReturn;
}
public static boolean isCollection(final Class<?> clazz) {
boolean lvReturn = false;
if (clazz == null) {
lvReturn = false;
}
else if (Collection.class.isAssignableFrom(clazz)) {
lvReturn = true;
}
return lvReturn;
}
public static boolean isArray(final Object obj) {
if (obj == null) {
return false;
}
return isArray(obj.getClass());
}
public static boolean isArray(final Class<?> clazz) {
boolean lvReturn = false;
if (clazz == null) {
lvReturn = false;
}else if(clazz.isArray()) {
lvReturn = true;
}
return lvReturn;
}
public static boolean isEnum(final Object obj) {
if (obj == null) {
return false;
}
return isEnum(obj.getClass());
}
public static boolean isEnum(final Class<?> clazz) {
boolean lvReturn = false;
if (clazz == null) {
lvReturn = false;
}else if (clazz.isEnum()) {
lvReturn = true;
}
return lvReturn;
}
WTF?你是爲你寫的每一行代碼付費?僅僅出於好奇:例如在isMapType(Object)方法中;爲什麼你需要8行代碼來表達「return object instanceof Map;」? – jarnbjo 2010-01-08 15:10:45
僅供參考:不是我的代碼,但是檢查對象是否爲null時會出現什麼問題,但我同意布爾型lvReturn = false;這在我的opion中是沒用的。 – Greg 2010-01-08 16:08:34
這是我見過的最糟糕的事情之一。 downmod乾旱或什麼?爲什麼你有一個巨大的地圖,其中每個鍵映射到自己? – danben 2010-01-08 16:45:15
- 1. 如何讓JSF識別原始數據類型?
- 2. 如何確定原始變量的原始類型?
- 3. 如何識別R中數據框中的變量類型?
- 4. SPSS AnswerTree如何識別變量類型?
- 5. PostgreSQL:如何識別數據類型?
- 6. JdbcTemplate如何識別數據類型?
- 7. 如何檢測原始數據類型?
- 8. 爲什麼在C#中我們需要初始化原始類型變量?
- 9. 如何識別原型?
- 10. 我們如何給我們Galaxy Note的手寫識別
- 11. 我們如何將輸入類型分配給一個變量
- 12. 定製鑄造原始數據類型
- 13. 如何在未給定變量時確定變量的類型?
- 14. 識別數據類型
- 15. 識別cookie數據類型
- 16. 給定數據類型效果如何覆蓋成員變量
- 17. 我可以將非原始數據類型傳遞給WebMethod嗎?
- 18. 我們如何識別HTTP層的設備類型
- 19. JavaScript中的原始數據類型與非原始數據類型之間的區別
- 20. PL/SQL原始數據類型變量比較
- 21. SSE數據類型和原始類型
- 22. 我們如何改變Partial類中屬性的數據類型?
- 23. 我們如何在原始類型上使用.class?
- 24. 如何識別變量的對象類型?
- 25. 獲取原始原型對象內給定一個變量存儲在原始原型
- 26. 找回原始類型的提升變量變量
- 27. 如何識別numpy的整數類型?
- 28. 識別變體類型
- 29. 字符串:JavaScript中的原始類型變量或引用類型變量?
- 30. plpgsql:我們如何給varchar數據類型賦予「max」值?
你的意思是一個局部變量找什麼東西?請舉個例子。 – skaffman 2010-01-08 14:11:09
這個問題有一個錯誤的前提 - 如果你能夠編譯你的程序並且可以引用有問題的變量,那麼你已經知道那個變量的類型。 – Chii 2010-01-08 14:16:05
如果您對知道原始數據類型有什麼期望,您打算如何處理它? – 2010-01-08 14:17:39