1

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

以下是我的解决方案。

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("unchecked") 的情况下避免这种警告“警告:[unchecked] unchecked cast”吗?
  2. 有没有其他优雅的方法来解决上述问题
4

4 回答 4

5

以下应该可以正常工作:

List<T> list = new ArrayList<T>(); 
List<T> list = new ArrayList<>(); // Java 7
于 2012-10-10T01:28:53.493 回答
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;
}
于 2012-10-10T01:31:11.990 回答
1

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

这里的问题是,您正在从列表进行未经检查的T转换,String或者Integer当您应该直接定义列表并使用转换添加元素时:

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;
}
于 2012-10-10T01:36:56.013 回答
0
  1. 据我所知不是

  2. 跳过 attrClass 参数,因为它实际上使方法非泛型。

于 2012-10-10T01:32:06.427 回答