我想在我的项目中定义泛型静态方法。 要求是将方法返回类型作为方法参数之一。
以下是我的解决方案。
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;
}
我有两个问题。
答案 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
应为String
或Integer
。
这里的问题是,当您应该直接定义列表并添加时,您正在从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;
}
答案 3 :(得分:0)
不是我所知
跳过attrClass参数,因为它实际上使该方法不是通用的。