在Java中定义通用方法的最佳方法是什么?

时间:2012-10-10 01:25:54

标签: java generics

我想在我的项目中定义泛型静态方法。 要求是将方法返回类型作为方法参数之一。

以下是我的解决方案。

public static <T> List<T> convertMapToAttribute(Class<T> attrClass, T attr) {
    List<T> list = null;
    if (attrClass.equals(String.class)) {
        list = (List<T>) new ArrayList<String>();
        list.add(attr);
    } else if (attrClass.equals(Integer.class)) {
        list = (List<T>)new ArrayList<Integer>();
        list.add(attr);
    }
    return list;
 }

我有两个问题。

  1. 我们可以避免这种警告“警告:[未经检查]未选中” 没有添加@SuppressWarnings(“未选中”)?
  2. 有没有其他优雅的方法来解决上述问题

4 个答案:

答案 0 :(得分:5)

以下应该可以正常工作:

List<T> list = new ArrayList<T>(); 
List<T> list = new ArrayList<>(); // Java 7

答案 1 :(得分:4)

难道你不能做像...这样的事情。

public static <T> List<T> convertMapToAttribute(Class<T> attrClass, T attr) {
    List<T> list = new ArrayList<T>(1);
    list.add(attr);
    return list;
}

代替?

根据反馈更新

public static <T> List<T> convertMapToAttribute(T attr) {
    List<T> list = new ArrayList<T>(1);
    list.add(attr);
    return list;
}

答案 2 :(得分:1)

通过将Class<T>作为参数,执行检查转换(并跳过烦人的警告)的方法是调用attrClass.cast(),如果转换失败,将ClassCastException抛出。在这种情况下,T应为StringInteger

这里的问题是,当您应该直接定义列表并添加时,您正在从T列表中对StringInteger的列表进行未经检查的强制转换。使用演员阵容的元素:

if (attrClass.equals(String.class)) {
    List<String> list =  new ArrayList<String>();
    list.add(attrClass.cast(attr));
}

整数也是如此。

你的方法有些奇怪(我实际上并不理解这个意图),你正在创建一个你也传递参数的类型的元素列表......这不应该像好? (因为您创建了T类型的列表并添加了T类型的元素。

public static <T> List<T> convertMapToAttribute(T attr) {
    List<T> list = new ArrayList<T>();
    list.add(attr);
    return list;
}

答案 3 :(得分:0)

  1. 不是我所知

  2. 跳过attrClass参数,因为它实际上使该方法不是通用的。