Java 在JLS中,将原始类型分配给无界类型是否合法?

Java 在JLS中,将原始类型分配给无界类型是否合法?,java,generics,jls,Java,Generics,Jls,我正在寻找JLS对以下句子的引用,以使其合法: Vector<?> vector = PreJava5API.getRawVector(); Vector Vector=PreJava5API.getRawVector(); 这是给你的报价(): 来自未经检查的转换的警告包括双重情况,即一般化使用者使用传统库。例如,库的方法具有原始返回类型向量,但使用者将方法调用的结果分配给向量类型的变量。这是不安全的,因为原始向量可能具有与字符串不同的元素类型,但仍然允许使用未经检查的转换,以便

我正在寻找JLS对以下句子的引用,以使其合法:

Vector<?> vector = PreJava5API.getRawVector();
Vector Vector=PreJava5API.getRawVector();
这是给你的报价():

来自未经检查的转换的警告包括双重情况,即一般化使用者使用传统库。例如,库的方法具有原始返回类型向量,但使用者将方法调用的结果分配给向量类型的变量。这是不安全的,因为原始向量可能具有与字符串不同的元素类型,但仍然允许使用未经检查的转换,以便能够与遗留代码接口。来自未经检查的转换的警告表示,泛型使用者可能在程序的其他点遇到堆污染问题

所以你会得到一个警告(不是错误!)

Vector Vector=PreJava5API.getRawVector();
这是为了促进与遗留代码的互操作性

更安全的版本是使用通配符(如您的示例中所示)。有了这些,您在如何使用
向量方面受到了严重限制,从而使其更加安全,甚至不再需要警告:您所能做的就是拉出
对象(始终有效)。您不能向向量添加任何内容(因此该部分也是安全的)。

以下是您的报价():

来自未经检查的转换的警告包括双重情况,即一般化使用者使用传统库。例如,库的方法具有原始返回类型向量,但使用者将方法调用的结果分配给向量类型的变量。这是不安全的,因为原始向量可能具有与字符串不同的元素类型,但仍然允许使用未经检查的转换,以便能够与遗留代码接口。来自未经检查的转换的警告表示,泛型使用者可能在程序的其他点遇到堆污染问题

所以你会得到一个警告(不是错误!)

Vector Vector=PreJava5API.getRawVector();
这是为了促进与遗留代码的互操作性


更安全的版本是使用通配符(如您的示例中所示)。有了这些,您在如何使用
向量方面受到了严重限制,从而使其更加安全,甚至不再需要警告:您所能做的就是拉出
对象(始终有效)。您不能向向量添加任何内容(这样该部分也是安全的)。

您可以从关于分配的部分开始

它允许赋值转换

允许未经检查的转换


允许从原始
G
转换为
G
,无需警告。

您可以从关于分配的部分开始

它允许赋值转换

允许未经检查的转换


它允许从原始
G
转换为
G
,而无需发出警告。

您的意思是,为什么它不会导致编译时错误(即使将通配符替换为
字符串,也不会导致编译时错误),或者为什么甚至没有警告(为什么在这里需要一个通配符,通配符完全限制了您可以从这里执行的不安全操作)?您的意思是,为什么它不会导致编译时错误(它不会导致编译时错误,即使您将通配符替换为
字符串
),或者为什么甚至没有警告(为什么您希望在此处使用通配符,通配符完全限制了您可以在此处执行的不安全操作)?您的引用涵盖了为什么编译时会使用类似于
Vector
的类型发出警告,JLS中是否有关于
Vector
编译而不产生任何警告的内容?我理解为什么使用这样的类型声明是安全的,我只是尝试从JLS中获取所有单词。第5.1.9节()如何:“使用未经检查的转换会导致编译时未经检查的警告,除非[转换为的类型]是一个参数化类型,其中所有类型参数都是无界通配符"那句话说得很清楚,你能更新你的答案来接受吗?你的话涵盖了为什么它编译时使用了像
Vector
这样的警告类型,JLS中是否有关于
Vector
编译而不产生任何警告的内容?我理解为什么使用这样的类型声明是安全的,我只是在尝试获取JLS中的所有单词。第5.1.9()节如何:“使用未经检查的转换会导致编译时未经检查的警告,除非[type converted to]是一个参数化类型,其中所有类型参数都是无界通配符”。这句话很清楚,请更新您的答案以接受它?
Vector<String> vector = PreJava5API.getRawVector();