[英]What is the best way to define Generic Method in Java?
我想在我的一个项目中定义泛型静态方法。 要求将方法返回类型作为方法参数之一。
以下是我的解决方案。
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;
}
我有两个问题。
以下应该可以正常工作:
List<T> list = new ArrayList<T>();
List<T> list = new ArrayList<>(); // Java 7
你不能只是做...
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;
}
通过将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));
}
Integer也是如此。
您的方法有点棘手(实际上我不明白意图),您正在根据要传递参数的类型创建元素列表,这还行吗? (因为你创建的列表T
类型和添加的元素T
型)。
public static <T> List<T> convertMapToAttribute(T attr) {
List<T> list = new ArrayList<T>();
list.add(attr);
return list;
}
据我所知
跳过attrClass参数,因为它实际上使方法非泛型。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.