繁体   English   中英

用Java定义泛型方法的最佳方法是什么?

[英]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;
 }

我有两个问题。

  1. 我们是否可以在不添加@SuppressWarnings(“ unchecked”)的情况下避免发出“警告:[unchecked] unchecked cast”警告?
  2. 还有其他优雅的方法可以解决上述问题

以下应该可以正常工作:

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应该是StringInteger

这里的问题是,当您应该直接定义列表并使用类型转换添加元素时,您正在执行从T列表到StringInteger列表的未经检查的转换:

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;
}
  1. 据我所知

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM