2013-03-29 116 views
1

我该如何选择基于泛型类型的不同方法?java泛型:运行时类型检查以确定策略

只要我有一个泛型类型参数化的一类,我必须通过T型来选择正确的PreparedStatement二传手:

Class CustomFieldsTypeManager<T> { 
    ArrayList<T> data; 

    public void setUpStatement(PreparedStatement st){ 
     ... 
     if (**T==String**){ 
     st.setString(index, (String) data<T>.get(dt_index); 
     } else if (**T==Integer**){ 
     st.setInt(index, (String) data<T>.get(dt_index); 
     } 
     ... 
    } 
} 

回答

0

您正在寻找instanceof

if (data.get(dt_index) instanceof String) { 
    //... 
} 
+0

非常感谢!它的作用就像一种魅力。 – Azathoth

+0

@ user2224731请点击代表下方的检查标记帖子作为答案。 –

+0

唯一需要注意的是“非对象类型”(如int),其属于对象,以便类型检查以整数失败。 解决方法是强制转换为getter(data.get)。 [也许这个信息可以帮助别人在未来同样的问题] – Azathoth

4

由于类型擦除,泛型信息在运行时丢失。你应该尝试利用参数多态性以不同的方式,通过提供类的专业化:

class CustomFieldsTypeManager<T> { 
    ArrayList<T> data; 

    abstract void setUpStatement(PreparedStatement st); 
} 

class StringCustomFieldsTypeManager extends CustomFieldsTypeManager<String> { 
    void setUpStatement(PreparedStatement st) { 
    st.setString(index, data.get(dt_index)); // data it's already an ArrayList<String> 
    } 
} 

也有办法在运行时检查,但这个有点违背了仿制药的好点,即使他们”继承像这个解决方案一样安全(必须正确书写)。

+0

我已经使用instanceof解决了,无论如何,谢谢。我喜欢你的设计解决方案。是非常intresting – Azathoth

0

你不能。但是你可以做的是:

class CustomFieldsTypeManager<T> { 
    private Class<T> type; 
    public CustomFieldsTypeManager(Class<T> type) { 
     this.type = type; 
    } 
} 

然后:

CustomFieldsTypeManager<String> m = new CustomFieldsTypeManager<String>(String.class); 

最后:

public void setUpStatement(PreparedStatement st) { 
    if (type.equals(String.class)){ 
     st.setString(index, (String) data<T>.get(dt_index); 
    } else if (type.equals(Integer.class)){ 
     st.setInt(index, (String) data<T>.get(dt_index); 
    } 
} 

或者直接使用,而不是你使用的手机的PreparedStatement#setObject方法。

+0

天哪。我没有注意到那里有这样一种方法......我已经用这个实例解决了......但是,无论如何,我会记住未来 – Azathoth