Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

does Java type erasure erase my generic type?

I've thought java erasure wipes generic types out in compile time however when i test it by myself i realized there are some information about generic types in Bytecode.

here is my test :

i wrote 2 classes:

import java.util.*;
public class Test {
    List integerList;
} 

and

import java.util.*;
public class Test {
    List<Integer> integerList;
} 

i compiled both classes and somewhere in generic class i saw this line

integerList{blah blah}Ljava/util/List;{blah blah}
Signature{blah blah}%Ljava/util/List<Ljava/lang/Integer;>;{blah blah}<init>

in non generic class :

integerList{blah blah}Ljava/util/List;{blah blah}<init>

so obviously i have generic information inside bytecode so what is this erasure thing ??

like image 932
Morteza Adi Avatar asked Jul 03 '13 12:07

Morteza Adi


People also ask

Do generic classes use erasure?

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.

How does Java type erasure work?

Type erasure is a process in which compiler replaces a generic parameter with actual class or bridge method. In type erasure, compiler ensures that no extra classes are created and there is no runtime overhead.

What is type erasure and when would you use it?

Type-erasure simply means "erasing" a specific type to a more abstract type in order to do something with the abstract type (like having an array of that abstract type).


Video Answer


1 Answers

what is this erasure thing ??

Erasure is a mapping from generic to raw types. The common phrase "because of erasure" is essentially meaningless. What is significant are the specifications that use the mapping.

There are two interesting uses.

  • It's used to map method signatures from using generics to raw types. It is the raw-type signatures that used for overloading. This causes the vast majority of the problems with "erasure". For instance, you can't have two methods add(List<String>) and add(List<Integer>) in the same type. Overloading probably isn't a great idea, and there's not a great willingness to add this feature.

  • The type available for an instance of an object at runtime is the type it was created with erased. So if you cast to, say, (String) that will be checked at runtime, but if you cast to List<String> only the erasure of that type (List) will be checked. You can have the variables of type List<String> and List<Integer> point to exactly the same instance. In practice, you shouldn't be using casts (of reference types) in 1.5 and later.

Where practical, generic information is kept in class files and made available through reflection. So you'll find it on class definitions, supertypes, fields, methods, constructors, etc.

like image 59
Tom Hawtin - tackline Avatar answered Oct 24 '22 14:10

Tom Hawtin - tackline