devever
devever

Reputation: 23

Why HashMap instance's class type compare equal with HashMap.class?

HashMap<String, Set<String>> foo = new HashMap<>();
if (foo.getClass().equals(HashMap.class)) {
    System.out.print(true);
}

The above code print true. Why are these two type compare equal? to me foo.getClass() contains more type info than HashMap.class.

Upvotes: 0

Views: 79

Answers (2)

spectral
spectral

Reputation: 21

Generics aren't important during the runtime. Thus the following:

System.out.println(foo.getClass().equals(HashMap.class));

will return true.

Upvotes: -1

Karol Dowbecki
Karol Dowbecki

Reputation: 44952

Java implemented generics with type erasure. In runtime there is no information about generics.

Generics were introduced to the Java language to provide tighter type checks at compile time and to support generic programming. To implement generics, the Java compiler applies type erasure to:

  • Replace all type parameters in generic types with their bounds or Object if the type parameters are unbounded. The produced bytecode, therefore, contains only ordinary classes, interfaces, and methods.
  • Insert type casts if necessary to preserve type safety.
  • Generate bridge methods to preserve polymorphism in extended generic types.

Type erasure ensures that no new classes are created for parameterized types; consequently, generics incur no runtime overhead.

Upvotes: 2

Related Questions