2014-03-05 71 views
2

我有以下类:如何确定java中没有反射的泛型属性的类类型?

public final class Param<T> 
{ 
    private final String name; 
    private T value; 
    public Param(String name) 
    { 
     this.name = name; 
    } 

    public void setValue(T value) { this.value = value;} 
    public T getValue() { return value; } 
} 

我会初始化它以下列方式:

Param<Long> foo = new Param<>("bar"); 
Param<String> baz = new Param<>("foo"); 

我想一个public boolean validate(String value)方法添加到这个类,它会做一些类似如下:

public boolean validate(String value) 
{ 
    try 
    { 
     if (this.value instanceof String) 
      return true; 

     if (this.value instanceof Long) 
      this.value = (T) Long.valueOf(value); 
     else if (this.value instanceof Integer) 
      this.value = (T) Integer.valueOf(value); 
     //Snip.. a few more such conditions for Double, Float, and Booleans 
     return true; 
    } 
    catch (NumberFormatException e) 
    { 
     return false; 
    } 
} 

我的问题是,将上述方法工作,用于正确地确定的“类型” 10并正确铸造string valueT value?或者我应该使用不同的方法来验证参数?

+0

重复的[SO:在java中使用反射获取泛型参数的类型](http://stackoverflow.com/questions/1901164/get-type-of-a-generic-parameter-in-java-with-反射)? –

+0

@ Mr.Polywhirl这个问题完全不同,我的思维与反思没有任何关系。事实上,我想不做反思。 –

+0

你是否真的打算手动检查人类已知的每种类型? – 2rs2ts

回答

4

Java通用类型没有通用化,这意味着如果您需要关于它们的运行时信息,则需要其他一些机制来跟踪它们。

一种常用方法是在Class<? extends T>令牌传递在构造函数中:

public final class Param<T> 
{ 
    private final String name; 
    private T value; 
    private Class<? extends T> type; 
    public Param(String name, Class<? extends T> type) 
    { 
     this.name = name; 
     this.type = type; 
    } 

    public boolean isString() { 
     return String.class.isAssignableFrom(type); 
    } 
} 
+2

你是C-sharpie,对吧?它是Java中的布尔值) –

+0

实际上,我是Java的第一人,但最近我被迫做PHP工作。 – Daniel

3

所以,呃,你想:

if (this.value instanceof Long) 
    this.value = (T) Long.valueOf(value); 

如果valueLong,将其转换为Long,将它投射到Long,并将其存储回value。什么?

不,不,我不认为这会起作用。