【问题标题】:What causes javac to issue the "uses unchecked or unsafe operations" warning是什么导致 javac 发出“使用未经检查或不安全的操作”警告
【发布时间】:2010-09-16 21:55:36
【问题描述】:

例如:

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

【问题讨论】:

  • 我正在使用 sun.misc.Unsafe 动态创建一些类,并在输出中给出这些提示

标签: java generics warnings


【解决方案1】:

如果您使用没有类型说明符的集合(例如,Arraylist() 而不是 ArrayList<String>()),这会出现在 Java 5 及更高版本中。这意味着编译器无法使用 generics 检查您是否以类型安全的方式使用该集合。

要消除警告,只需具体说明您在集合中存储的对象类型即可。所以,而不是

List myList = new ArrayList();

使用

List<String> myList = new ArrayList<String>();

在 Java 7 中,您可以使用 Type Inference 缩短泛型实例化。

List<String> myList = new ArrayList<>();

【讨论】:

  • 在 Java 7 中,即使将 Type Interference 与此集合一起使用,我也会收到相同的警告:ConcurrentHashMap&lt;Integer, Object&gt; objs = new ConcurrentHashMap()
  • @Lucio 你仍然需要尖括号。 new ConcurrentHashMap&lt;&gt;()
  • 只是要指出,这不是特定的集合。您收到错误是因为 Java 编译器通常无法确保类型安全。例如,使用以下代码产生相同的警告: AbstractMap.SimpleEntry entry = new AbstractMap.SimpleEntry("hello", "world");
  • -Xlint:uncheckedMAVEN
【解决方案2】:

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

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

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

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

【讨论】:

  • 我希望更多的人会支持这个答案。我支持我选择@Bill the Lizard 的答案,但这个答案很贴近我的心,因为它向我展示了答案在警告本身中正盯着我看,并详细说明了遇到错误的另一个原因。跨度>
【解决方案3】:

对于Android Studio,需要添加:

allprojects {

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

    // ...
}

在您项目的 build.gradle 文件中了解此错误的产生位置。

【讨论】:

  • 谢谢,我通过添加这个找到了我的警告来自哪里
  • 我收到此警告,并且 AS 显示了它产生的类。这不是错误,只是警告。我们为什么要添加这个选项?你的情况没有显示问题类吗?
  • 大声笑,我只是回答这个问题,,直到你添加这个问题才会显示出来。
【解决方案4】:

此警告表示您的代码在原始类型上运行,请使用

重新编译示例
-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

docs.oracle.com 在这里谈到它: http://docs.oracle.com/javase/tutorial/java/generics/rawTypes.html

【讨论】:

  • 我认为确实如此。他链接到 Oracle 文档以获取此确切警告。
【解决方案5】:

我有 2 年的课程和一些新课程。我在Android Studio中解决了如下:

allprojects {

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

}

在我的项目 build.gradle 文件中 (Borzh solution)

然后如果剩下一些方法:

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

【讨论】:

    【解决方案6】:

    例如,当您调用返回泛型集合的函数并且您自己没有指定泛型参数时。

    函数

    List<String> getNames()
    
    
    List names = obj.getNames();
    

    会产生这个错误。

    要解决它,您只需添加参数

    List<String> names = obj.getNames();
    

    【讨论】:

      【解决方案7】:

      如果我没记错的话,当 java 添加 Generics 时添加了“未经检查或不安全的操作”警告。它通常要求您以一种或另一种方式更明确地说明类型。

      例如。代码 ArrayList foo = new ArrayList(); 触发该警告,因为 javac 正在寻找 ArrayList&lt;String&gt; foo = new ArrayList&lt;String&gt;();

      【讨论】:

        【解决方案8】:

        我只想添加一个我经常看到的未经检查的警告示例。如果您使用实现像 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();
            }
        }
        

        getInstance() 返回一个实现 Serializable 的对象。这必须转换为实际类型,但这是未经检查的转换。

        【讨论】:

          【解决方案9】:

          解决方案是在&lt;&gt; 中使用特定类型,例如ArrayList&lt;File&gt;

          示例:

          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);
          

          上面的代码就可以了。在ArrayList之后的第三行只有变化。

          【讨论】:

            【解决方案10】:

            你可以保持通用形式,写成:

            // list 2 is made generic and can store any type of Object
                    ArrayList<Object> list2 = new ArrayList<Object>();
            

            将 ArrayList 的类型设置为 Object 为我们提供了存储任何类型数据的优势。您不需要使用 -Xlint 或其他任何东西。

            【讨论】:

              【解决方案11】:

              我有ArrayList&lt;Map&lt;String, Object&gt;&gt; items = (ArrayList&lt;Map&lt;String, Object&gt;&gt;) value;。因为value 是一个复杂的结构(我想clean JSON),所以可以在数字、布尔值、字符串、数组上发生任何组合。所以,我使用了@Dan Dyer 的解决方案:

              @SuppressWarnings("unchecked")
              ArrayList<Map<String, Object>> items = (ArrayList<Map<String, Object>>) value;
              

              【讨论】:

                【解决方案12】:

                此警告也可能因

                而引发

                new HashMap() 或 new ArrayList() 必须是泛型类型,否则编译器会生成警告。

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

                new HashMap() => Map<String,Object> map = new HashMap<String,Object>()
                new HashMap() => Map<String,Object> map = new HashMap<>()
                
                new ArrayList() => List<String,Object> map = new ArrayList<String,Object>()
                new ArrayList() => List<String,Object> map = new ArrayList<>()
                

                【讨论】:

                  猜你喜欢
                  • 2013-11-24
                  • 2019-02-09
                  • 1970-01-01
                  • 1970-01-01
                  • 2011-01-26
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多