如何使以下分配合法化?

以下产生ClassCastException,我不确定为什么。我知道,由于不变属性和协变量属性以及泛型不可靠但不理解为什么会生成RuntimeException的事实,泛型数组有点忌讳。

   ...
   Integer[] sap = (Integer[]) iterableToArray(path.pathTo(w));
}

private <T> T[] iterableToArray(Iterable<T> it){
   ArrayList<T> list = new ArrayList<>();
   for(T o : it)
      list.add(o);
   return (T[]) list.toArray();

}