java中的未检查赋值

java中的未检查赋值,java,generics,casting,Java,Generics,Casting,我正在使用以下代码在n维列表中查找唯一对象的一维列表(归功于StackOverflow上的某个人刚才的方法): 现在我知道我可以添加@SuppressWarnings(“unchecked”),它会隐藏警告。但是,在没有这一警告的情况下,有没有一种根本不同的做法?如果这个警告真的存在,到底有没有关系?基本上好的代码是否仍然包含警告?这是因为您正在将对象“listItem”强制转换为没有泛型类型参数的“List” 要消除这种情况,只需将泛型类型参数添加到强制转换中,就可以消除警告 (List<

我正在使用以下代码在n维列表中查找唯一对象的一维列表(归功于StackOverflow上的某个人刚才的方法):


现在我知道我可以添加
@SuppressWarnings(“unchecked”)
,它会隐藏警告。但是,在没有这一警告的情况下,有没有一种根本不同的做法?如果这个警告真的存在,到底有没有关系?基本上好的代码是否仍然包含警告?

这是因为您正在将对象“listItem”强制转换为没有泛型类型参数的“List”

要消除这种情况,只需将泛型类型参数添加到强制转换中,就可以消除警告

(List<T>) listItem
(列表)列表项

好吧,我看不到摆脱这个警告的方法,因为 您可以向下转换
对象
列表

在您的例子中,列表中的项可以是某个对象或列表,并且您没有泛型支持或其他可以描述这一事实的语言构造

所以,正如我在某一点上看到的,你需要执行铸造操作

但不同的是,你现在拥有的东西并不安全:你到底是如何确保这一点的

for (Object listItem : list0) {
    getUniqueObjectsInArray((List)listItem, list1, dimension - 1);
}
listItem
是列表的子类型吗


您可以尝试绑定泛型类型和/或执行检查的
实例,以确保转换的正确性。

您正在隐式转换列表中的所有项目

static <T> T findAnItem(List<T> items){

    return items.get(0);
}

    List<Integer> ints = new ArrayList<>();
    ints.add(0);
    Object a = ints;
    System.out.println(findAnItem((List<?>)a));
static T findAnItem(列表项){
返回项目。获取(0);
}
List ints=new ArrayList();
积分相加(0);
对象a=整数;
System.out.println(findAnItem((List)a));

此示例将在没有警告的情况下编译,因为我没有将列表中的对象强制转换为对象旁边的任何对象。如果我将
切换到
Integer
,则会收到一条警告。

我看不到消除该警告的方法,因为您必须非常小心地声明和使用正确的泛型数组类型。所以也许你决定忽略这个警告

  • 您的
    列表
    声明正确描述了具有T类型元素的一维数组
  • 二维数组是一个列表,包含元素列表,因此应该是
    list
  • 三维数组是一个列表,包含列表元素的列表,因此应该是
    list
  • 等等
搜索的核心是递归的
getUniqueObjectsInArray(…)
方法。要消除该警告,您必须确保使用例如
List
的调用生成使用
List
的递归(内部)调用,并且维度比以前少一个,因此第一次尝试如下:

public static <T,E> getUniqueObjectsInArray(List<T> array, List<E> results, int dimension) {
    //...
    for (T listItem : array) {
        getUniqueObjectsInArray(listItem, results, dimension - 1);
    }
}
public静态getUniqueObjectsInArray(列表数组、列表结果、int维){
//...
for(T列表项:数组){
getUniqueObjectsInArray(列表项,结果,维度-1);
}
}
这也行不通,因为编译器不允许您执行递归调用,因为他无法确保listItem是一个列表。让我们试着通过以下方式告诉他:

public static <T,E> getUniqueObjectsInArray(List<List<T>> array, List<E> results, int dimension) {
    //...
    for (List<T> listItem : array) {
        getUniqueObjectsInArray(listItem, results, dimension - 1);
    }
}
public静态getUniqueObjectsInArray(列表数组、列表结果、int维){
//...
用于(列表项:数组){
getUniqueObjectsInArray(列表项,结果,维度-1);
}
}
现在他知道这是一个列表,但这还不够,因为现在需要一个
列表
来调用
getUniqueObjectsInArray(…)


你看,试图做正确的泛型声明,这样编译器就不会发出警告,如果可能的话,会变得非常复杂。老实说,我看不到避免警告的方法,所以不要花太多时间,添加@SuppressWarnings(“unchecked”)。

这是太多的代码,您能将其减少到必要的最小值吗?整个“在n维列表中找到唯一对象的一维列表”似乎完全不相关。至于这个问题,
T
在这种情况下是一个列表,这一事实从键入任何方式都看不出来。编译器将无法对此进行推断,因此无论如何,您将有一个未经检查的赋值。您是否尝试了列表?我已经尝试过了。转换为
(列表)
而不是
(列表)
仍会产生相同的警告<代码>未选中的强制转换:“java.lang.Object”到“java.util.List”
实际上与此相反。将listItem强制转换为List很好,未选中的警告是列表中的所有T都被隐式强制转换。
public static <T,E> getUniqueObjectsInArray(List<T> array, List<E> results, int dimension) {
    //...
    for (T listItem : array) {
        getUniqueObjectsInArray(listItem, results, dimension - 1);
    }
}
public static <T,E> getUniqueObjectsInArray(List<List<T>> array, List<E> results, int dimension) {
    //...
    for (List<T> listItem : array) {
        getUniqueObjectsInArray(listItem, results, dimension - 1);
    }
}