2010-01-08 57 views
0

我們如何識別給定變量的原始數據類型?我們如何識別給定變量的原始數據類型?

+0

你的意思是一個局部變量找什麼東西?請舉個例子。 – skaffman 2010-01-08 14:11:09

+5

這個問題有一個錯誤的前提 - 如果你能夠編譯你的程序並且可以引用有問題的變量,那麼你已經知道那個變量的類型。 – Chii 2010-01-08 14:16:05

+0

如果您對知道原始數據類型有什麼期望,您打算如何處理它? – 2010-01-08 14:17:39

回答

2

你正在嘗試做的事當然只適用於使用反射的工作(並且再次使用Object)。然後你就可以識別與類型:

field.getType() 

field.getType().getName() 

取決於你是否想要的名稱,或Class

然後你就可以比較Integer.TYPEDouble.TYPE等,這是原始Class表示。

+2

我認爲他的意思是像'int'等原始類似 – skaffman 2010-01-08 14:14:14

+0

然後,也許他應該改變這個問題反映了這一點。 – Timothy 2010-01-08 14:15:10

+0

你不能在一個原始類型的變量上調用'getClass()'。 這個問題有一個錯誤的前提 - 如果你能夠編譯你的程序並且可以引用有問題的變量,那麼你已經知道那個變量的類型。 – Chii 2010-01-08 14:15:28

0

我不認爲你可以。

我的意思是......如果我創建了一個「學生」類型的對象,那麼原語是什麼?沒有意義。

1

我假設你的意思是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()); 
} 

希望這有助於!

+1

如果OP是一個編譯器或執行程序,我們已經失去了大機器人戰爭:(人類很好,但它持續了,我猜。 – Alex 2011-10-10 15:26:52

-4

我想你沿着這條線

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

WTF?你是爲你寫的每一行代碼付費?僅僅出於好奇:例如在isMapType(Object)方法中;爲什麼你需要8行代碼來表達「return object instanceof Map;」? – jarnbjo 2010-01-08 15:10:45

+0

僅供參考:不是我的代碼,但是檢查對象是否爲null時會出現什麼問題,但我同意布爾型lvReturn = false;這在我的opion中是沒用的。 – Greg 2010-01-08 16:08:34

+0

這是我見過的最糟糕的事情之一。 downmod乾旱或什麼?爲什麼你有一個巨大的地圖,其中每個鍵映射到自己? – danben 2010-01-08 16:45:15