Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是什么导致javac发出;使用未经检查或不安全的操作”;警告_Java_Generics_Warnings - Fatal编程技术网

是什么导致javac发出;使用未经检查或不安全的操作”;警告

是什么导致javac发出;使用未经检查或不安全的操作”;警告,java,generics,warnings,Java,Generics,Warnings,例如: javac Foo.java Note: Foo.java uses unchecked or unsafe operations. Note: Recompile with -Xlint:unchecked for details. 如果使用不带类型说明符的集合(例如,Arraylist()而不是Arraylist()),则在Java5和更高版本中会出现这种情况。这意味着编译器无法检查您是否以类型安全的方式使用集合,即使用 要消除此警告,只需具体说明在集合中存储的对象类型。因此,与其

例如:

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

如果使用不带类型说明符的集合(例如,
Arraylist()
而不是
Arraylist()
),则在Java5和更高版本中会出现这种情况。这意味着编译器无法检查您是否以类型安全的方式使用集合,即使用

要消除此警告,只需具体说明在集合中存储的对象类型。因此,与其

List myList = new ArrayList();
使用

List myList=new ArrayList();

在Java7中,您可以通过使用来缩短泛型实例化

List myList=new ArrayList();

例如,当您调用一个返回泛型集合的函数而不自己指定泛型参数时

函数

List<String> getNames()


List names = obj.getNames();
List getNames()
列表名称=obj.getNames();
将生成此错误

要解决这个问题,只需添加参数

List<String> names = obj.getNames();
List name=obj.getNames();
如果我没记错的话,“未检查或不安全操作”警告是在添加java时添加的。它通常要求你以这样或那样的方式更明确地描述类型


比如说。代码
ArrayList foo=new ArrayList()
触发该警告,因为javac正在查找
ArrayList foo=new ArrayList()

如果按照它的建议执行并使用“-Xlint:unchecked”开关重新编译,它将为您提供更详细的信息

与使用原始类型(如其他答案所述)一样,未经检查的强制转换也可能导致警告

使用-Xlint编译后,应该能够重新编写代码以避免出现警告。这并不总是可能的,尤其是当您与无法更改的遗留代码集成时。在这种情况下,您可以决定在您知道代码正确的地方取消显示警告:

@SuppressWarnings("unchecked")
public void myMethod()
{
    //...
}

此警告意味着您的代码对原始类型进行操作,请使用

-Xlint:unchecked 
了解详情

像这样:

javac YourFile.java -Xlint:unchecked

Main.java:7: warning: [unchecked] unchecked cast
        clone.mylist = (ArrayList<String>)this.mylist.clone();
                                                           ^
  required: ArrayList<String>
  found:    Object
1 warning
javacyourfile.java-Xlint:未选中
Main.java:7:警告:[未选中]未选中强制转换
clone.mylist=(ArrayList)this.mylist.clone();
^
必需:ArrayList
发现:对象
1警告
docs.oracle.com在这里讨论:

解决方案是在
中使用特定类型,如
ArrayList

例如:

File curfolder = new File( "C:\\Users\\username\\Desktop");
File[] file = curfolder.listFiles();
ArrayList filename = Arrays.asList(file);
上述代码生成警告,因为
ArrayList
不是特定类型

File curfolder = new File( "C:\\Users\\username\\Desktop");
File[] file = curfolder.listFiles();
ArrayList<File> filename = Arrays.asList(file);
File curfolder=新文件(“C:\\Users\\username\\Desktop”);
File[]File=curfolder.listFiles();
ArrayList文件名=Arrays.asList(文件);

上面的代码就可以了。唯一的变化是在
ArrayList

之后的第三行,我只想添加一个我经常看到的未检查警告的示例。如果使用实现Serializable之类接口的类,通常会调用返回接口对象的方法,而不是实际的类。如果要返回的类必须强制转换为基于泛型的类型,则会出现此警告

下面是一个简单(有点傻)的例子来演示:

import java.io.Serializable;

public class SimpleGenericClass<T> implements Serializable {

    public Serializable getInstance() {
        return this;
    }

    // @SuppressWarnings("unchecked")
    public static void main() {

        SimpleGenericClass<String> original = new SimpleGenericClass<String>();

        //  java: unchecked cast
        //    required: SimpleGenericClass<java.lang.String>
        //    found:    java.io.Serializable
        SimpleGenericClass<String> returned =
                (SimpleGenericClass<String>) original.getInstance();
    }
}
import java.io.Serializable;
公共类SimpleGenericClass实现可序列化{
公共可序列化getInstance(){
归还这个;
}
//@SuppressWarnings(“未选中”)
公共静态void main(){
SimpleGenericClass original=新的SimpleGenericClass();
//java:未经检查的强制转换
//必需:SimpleGenericClass
//找到:java.io.Serializable
返回的SimpleGenericClass=
(SimpleGenericClass)original.getInstance();
}
}

getInstance()返回一个实现可序列化的对象。这必须强制转换为实际类型,但这是未选中的强制转换。

对于Android Studio,您需要添加:

allprojects {

    gradle.projectsEvaluated {
        tasks.withType(JavaCompile) {
            options.compilerArgs << "-Xlint:unchecked"
        }
    }

    // ...
}
所有项目{
gradle.项目评估{
tasks.withType(JavaCompile){

options.compilerArgs您可以将其保留为通用形式,并将其编写为:

// list 2 is made generic and can store any type of Object
        ArrayList<Object> list2 = new ArrayList<Object>();
//列表2是通用的,可以存储任何类型的对象
ArrayList list2=新的ArrayList();

将ArrayList的类型设置为对象使我们能够存储任何类型的数据。您不需要使用-Xlint或其他任何东西。

我有2年的类和一些新类。我在Android Studio中解决了它,如下所示:

allprojects {

    gradle.projectsEvaluated {
        tasks.withType(JavaCompile) {
            options.compilerArgs << "-Xlint:unchecked"
        }
    }

}

由于以下原因也可能引发此警告:

新HashMap()或泛型类型的新ArrayList()必须是特定的,否则编译器将生成警告

请确保如果您的代码包含以下内容,则必须相应地进行更改

new HashMap()=>Map=new HashMap() new HashMap()=>Map=new HashMap()

新建ArrayList()=>列表映射=新建ArrayList() new ArrayList()=>List map=new ArrayList()

我有
ArrayList items=(ArrayList)value;
。因为
value
是一个复杂的结构(我想),数字、布尔值、字符串、数组都可能发生任何组合。因此,我使用了@Dan Dyer的解决方案:

@SuppressWarnings("unchecked")
ArrayList<Map<String, Object>> items = (ArrayList<Map<String, Object>>) value;
@SuppressWarnings(“未选中”)
ArrayList项=(ArrayList)值;

我希望有更多的人支持这个答案。我支持我选择的@Bill the蜥蜴的答案,但这个答案让我感觉非常贴心,因为它向我展示了答案就在警告本身的面前,并且详细说明了遇到错误的另一个原因。这是最终答案!这个答案应该是正确的n标记为解决方案!谢谢!在Java 7中,即使对该集合使用类型干扰,我也收到了相同的警告:
ConcurrentHashMap objs=new ConcurrentHashMap()
@Lucio您仍然需要尖括号。
new ConcurrentHashMap()
只是要指出,这不是特定于集合的。之所以会出现错误,是因为Java编译器无法确保类型saf
allprojects {

    gradle.projectsEvaluated {
        tasks.withType(JavaCompile) {
            options.compilerArgs << "-Xlint:unchecked"
        }
    }

}
@SuppressWarnings("unchecked")
public void myMethod()
{
    //...
}
@SuppressWarnings("unchecked")
ArrayList<Map<String, Object>> items = (ArrayList<Map<String, Object>>) value;