2014-07-05 74 views
3

我需要將字符串轉換爲變量值。我發現僅適用於C#的解決方案。我需要它在Java中。從字符串到泛型的轉換

public class Property<T> { 

    T value; 

    public void setValue(String input){ 
     if(value instanceof String){ 
      value= input; // value is type of T not type of string (compilation error) 
         // incompatible types: String cannot be converted to T 
     } 
     if(value instanceof int){ 
      //parse string 
     } 
     if(value instanceof boolean){ 
      //parse string 
     } 
     ... 
    } 
} 
+0

如果你不知道T是什麼,你不能轉換爲它。你可以施放,但很容易失敗。我說,設計不好。 – MightyPork

+0

什麼是「特定類型的通用變量」? – Whymarrh

+1

這沒有任何意義,如果參數是字符串類型的話,它怎麼可能不是'String'。 –

回答

7

這不是它的工作原理。但是,您可以使用多態性來獲得有用的結果。

與多態性解決方案

基地通用(和抽象)財產

public abstract class Property<T> { 
    T value; 
    public abstract void setValue(String input); 
} 

物業絃樂

public class StringProperty extends Property<String> { 
    @Override 
    public void setValue(String input) { 
     this.value = input; 
    } 
} 

物業整數

public class IntegerProperty extends Property<Integer> { 
    @Override 
    public void setValue(String input) { 
     this.value = Integer.valueOf(input); 
    } 
} 

不知道你的實際目標是什麼,但這種方法可能奏效。請注意,input instanceof T將由於類型擦除而失敗。它不會工作。


解決方案與Class<T>作爲參數

更詳細地說明你的方法,這將工作 - 但它的醜陋。

醜並不是很方便。不知道你爲什麼想要它,tbh。

class Property<T> { 

    public T value; 
    private final Class<T> clazz; 

    public Property(Class<T> clazz) { 
     super(); 
     this.clazz = clazz; 
    }  

    @SuppressWarnings("unchecked") 
    public void setValue(String input) { 
     if (clazz.isAssignableFrom(String.class)) { 
      value = (T) input; 
     } else if (clazz.isAssignableFrom(Integer.class)) { 
      value = (T) Integer.valueOf(input); 
     } else if (clazz.isAssignableFrom(Boolean.class)) { 
      value = (T) Boolean.valueOf(input); 
     } else if (clazz.isAssignableFrom(Double.class)) { 
      value = (T) Double.valueOf(input); 
     } else { 
      throw new IllegalArgumentException("Bad type."); 
     } 
    } 
} 

使用像這樣:

Property<String> ff = new Property<>(String.class); 
ff.setValue("sdgf"); 

Property<Integer> sdg = new Property<>(Integer.class); 
sdg.setValue("123"); 

System.out.println(ff.value); 
System.out.println(sdg.value); 

解決方案與Reflection

顯然,有可能找出用於實例屬性中的參數。

這個小妙方讓你這一點:

(Class<?>) getClass().getTypeParameters()[0].getBounds()[0] 

我甚至不知道我是如何設法找到它。那麼,這裏我們去:

class Property<T> { 

    T value;  

    @SuppressWarnings("unchecked") 
    public void setValue(String input) 
    { 
     // BEHOLD, MAGIC! 
     Class<?> clazz = (Class<?>) getClass().getTypeParameters()[0].getBounds()[0]; 

     if (clazz.isAssignableFrom(String.class)) { 
      value = (T) input; 
     } else if (clazz.isAssignableFrom(Integer.class)) { 
      value = (T) Integer.valueOf(input); 
     } else if (clazz.isAssignableFrom(Boolean.class)) { 
      value = (T) Boolean.valueOf(input); 
     } else if (clazz.isAssignableFrom(Double.class)) { 
      value = (T) Double.valueOf(input); 
     } else { 
      throw new IllegalArgumentException("Bad type."); 
     } 
    } 
} 

而不要看着我,我不會使用它。我有一些常識。

+0

我有這個代碼之前,但我試圖避免它。我想我會解析更高級別的字符串,然後調用類型爲T的方法setValue(T input)。但是,謝謝。 – SpeedEX505

+0

您必須將T的類作爲參數傳遞給Property的構造函數。然後你可以把這個類與一些已知的類型進行比較,然後在它上面進行分支 - 但它是醜陋的。 Polumorphism在那裏被使用,而不是被避免。 – MightyPork

+0

那麼,確實有一個用例的人。想象一下,一個簡單的文本配置文件,XML,web服務結果(無論)給你一個<字符串,字符串>地圖,你實際上需要一個通用的方法,比如' V GetValueByKey(string key)',它給你適當的值而是一種理想的類型 - 而不是字符串。 – Anton

相關問題