352

For example:

javac Foo.java
Note: Foo.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
1
  • I'm creating some classes dynamically using sun.misc.Unsafe and it's giving these hints at the output Apr 28, 2020 at 1:39

12 Answers 12

448

This comes up in Java 5 and later if you're using collections without type specifiers (e.g., Arraylist() instead of ArrayList<String>()). It means that the compiler can't check that you're using the collection in a type-safe way, using generics.

To get rid of the warning, you need to be specific about what type of objects you're storing in the collection. So, instead of

List myList = new ArrayList();

use

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

In Java 7 you can shorten generic instantiation by using Type Inference.

List<String> myList = new ArrayList<>();
5
  • 1
    In Java 7, I got the same warning even using Type Interference with this collection: ConcurrentHashMap<Integer, Object> objs = new ConcurrentHashMap()
    – Lucio
    Jun 15, 2014 at 19:38
  • 17
    @Lucio You still need angle brackets. new ConcurrentHashMap<>() Jun 15, 2014 at 20:40
  • 3
    Just to point out, this is not collections specific. You get the error because Java compiler can't ensure type safety in general. For example, same warning is produced with the following code: AbstractMap.SimpleEntry<String, String> entry = new AbstractMap.SimpleEntry("hello", "world");
    – semonte
    Jul 8, 2014 at 7:08
  • 1
    -Xlint:unchecked with MAVEN
    – vanduc1102
    Mar 1, 2016 at 10:58
  • >using collections without type specifiers (e.g., Arraylist() instead of ArrayList<String>()) What is "type specifier" ? Did you mean "type argument" ?
    – Squared
    Nov 27, 2023 at 9:35
233

If you do what it suggests and recompile with the "-Xlint:unchecked" switch, it will give you more detailed information.

As well as the use of raw types (as described by the other answers), an unchecked cast can also cause the warning.

Once you've compiled with -Xlint, you should be able to rework your code to avoid the warning. This is not always possible, particularly if you are integrating with legacy code that cannot be changed. In this situation, you may decide to suppress the warning in places where you know that the code is correct:

@SuppressWarnings("unchecked")
public void myMethod()
{
    //...
}
2
  • 13
    I wish more people would upvote this answer. I stand by my selection of @Bill the Lizard's answer, but this answer is close to my heart for showing me that the answer was staring me right in the face in the warning itself as well as elaborating another reason for encountering the error.
    – user23987
    Apr 21, 2011 at 22:57
  • 2
    Where in Android studio to I enable or write this switch?
    – Andrew S
    Mar 22, 2022 at 17:53
34

For Android Studio, you need to add:

allprojects {

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

    // ...
}

in your project's build.gradle file to know where this error is produced.

3
  • thanks, i found where my warning is coming from by adding this Apr 13, 2020 at 16:10
  • I get this warning and AS shows a class where it produced. And this is not error, just warning. Why should we add this option? Wasn't a problem class shown in your situation?
    – CoolMind
    Apr 23, 2020 at 9:16
  • 1
    Lol, I just answer the question, and no, the problem isn't shown until you add this.
    – Borzh
    Apr 24, 2020 at 14:07
18

This warning means that your code operates on a raw type, recompile the example with the

-Xlint:unchecked 

to get the details

like this:

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 talks about it here: http://docs.oracle.com/javase/tutorial/java/generics/rawTypes.html

1
  • 1
    I think it does. He links to the Oracle documentation for this exact warning. Dec 2, 2014 at 21:40
8

I had 2 years old classes and some new classes. I solved it in Android Studio as follows:

allprojects {

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

}

In my project build.gradle file (Borzh solution)

And then if some Metheds is left:

@SuppressWarnings("unchecked")
public void myMethod()
{
    //...
}
1
  • This does not seem to be working with IntelliJ and Java20.
    – Tom
    Oct 2, 2023 at 12:50
4

for example when you call a function that returns Generic Collections and you don't specify the generic parameters yourself.

for a function

List<String> getNames()


List names = obj.getNames();

will generate this error.

To solve it you would just add the parameters

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

The "unchecked or unsafe operations" warning was added when java added Generics, if I remember correctly. It's usually asking you to be more explicit about types, in one way or another.

For example. the code ArrayList foo = new ArrayList(); triggers that warning because javac is looking for ArrayList<String> foo = new ArrayList<String>();

3

I just want to add one example of the kind of unchecked warning I see quite often. If you use classes that implement an interface like Serializable, often you will call methods that return objects of the interface, and not the actual class. If the class being returned must be cast to a type based on generics, you can get this warning.

Here is a brief (and somewhat silly) example to demonstrate:

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() returns an object that implements Serializable. This must be cast to the actual type, but this is an unchecked cast.

1
  • I think this is a defect of Java.
    – Tom
    Oct 2, 2023 at 12:48
1

The solution would be to use specific type in <> like ArrayList<File>.

example:

File curfolder = new File( "C:\\Users\\username\\Desktop");
File[] file = curfolder.listFiles();
ArrayList filename = Arrays.asList(file);

above code generate warning because ArrayList is not of specific type.

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

above code will do fine. Only change is in third line after ArrayList.

0
0

I have ArrayList<Map<String, Object>> items = (ArrayList<Map<String, Object>>) value;. Because value is a complex structure (I want to clean JSON), there can happen any combinations on numbers, booleans, strings, arrays. So, I used the solution of @Dan Dyer:

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

You can keep it in the generic form and write it as:

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

Setting type of ArrayList as Object gives us the advantage to store any type of data. You don't need to use -Xlint or anything else.

-1

This warning also could be raised due to new HashMap() or new ArrayList() that is generic type has to be specific otherwise the compiler will generate warning.

Please make sure that if you code contains the following you have to change accordingly

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