【问题标题】:Unchecked or Unsafe operations homework [duplicate]未经检查或不安全的操作作业[重复]
【发布时间】:2013-02-01 23:37:54
【问题描述】:

在我最近的课堂作业中,我们一直在使用泛型,我收到了以下警告:

Note: Selector.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details. 

据我了解,这是由于未指定我的集合中的对象类型造成的。我目前正在使用 int 进行测试,但该程序应该允许对任何类型的对象进行排序。我不认为我想将我的集合指定为 int,因此我的集合目前是 T 类型。但是我的说明明确指出我的程序不应产生任何警告。这是我的一种方法:

我现在拥有的:

     else {
        T[] a = new T[c.size()];
        c.toArray(T[] a);
        T min = a[0];
        for (int i = 0; i < a.size(); i++) {
           if (comp.compare(min, a[i]) > 0) {
              min = a[i];
           }
        }
        return min; 
     }

我得到了什么:

    Testing.java:48: error: generic array creation
            T[] a = c.toArray(new T[c.size()]);

【问题讨论】:

  • 您是否尝试过听取编译器的建议以查看详细信息?
  • 顺便说一句,你真的不想在这样的循环中调用toArray。 (您可能还需要考虑 Collection&lt;E&gt; 扩展 Iterable&lt;E&gt;...)

标签: java unsafe operations unchecked


【解决方案1】:

为了摆脱你应该使用的通知

Collection.toArray(T[] a)

而不是

Collection.toArray() 

Collection.toArray() 返回一个对象数组,所以你总是需要转换。

另外,调用 toArray 代价高昂,因为必须创建新数组,因此您应该考虑将其存储到变量中并重复使用。

不幸的是,无法创建泛型类型的数组,因此我认为您应该删除 toArray 并在集合上使用迭代器,例如:

Iterator<T> iterator = c.iterator();
T min = iterator.next(); //you already checked that there has to be first element
while (iterator.hasNext()) {
    T element = iterator.next();
    if (comp.compare(min, element) > 0) {
        min = element;
    }
}
return min;

【讨论】:

  • (T[] a) 对我来说究竟意味着什么?我通读了 API 并尝试进行一些调整,但我想我完全清楚调用 toArray() 与 toArray(T[] a) 的结果差异。
  • T[] a,表示一个类型为 T 的数组,方法 toArray 返回 Object,因为它必须向后兼容以前的版本,因此如果有人创建了第二个方法 toArray(T[] a)想要检索类型为 T 的数组。如 javadoc 中所述: T[] a 是要存储此集合的元素的数组,如果它足够大的话;否则,将为此目的分配一个相同运行时类型的新数组
  • 不幸的是,无法创建泛型类型的数组...因此我建议在集合上使用迭代器
  • 请检查更新的anwser
  • 真棒完美!谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多