Monday, June 16, 2014

Java Generics: What Beginners Find Surprising | OneWebSQL



Java Generics: What Beginners Find Surprising by Agnieszka Kozubek, 31 January 2013 Java generics

Backwards compatibility

 In case of Java generics, binary compatibility means that the JVM knows NOTHING about type parameters. The code has two versions: the source code version with type parameters, and the bytecode version where type parameters are erased. The bytecode looks very much like Java 4 version of the code.

Surprise 1: I can't create an object of parameter type!
return new T();
First, the type parameter T is only present at compile-time. In bytecode it is replaced by itsboundMotorcycle. So the runtime type of new T() is Motorcycle. The compile-time type of new T() is T. In a concrete instance of MotorcycleFactory the type T might be a concrete type, like Kawasaki.

Another reason is that you can't guarantee that type T has a no-argument public constructor. In Java there is no way to specify this requirement.
Surprise 2: I can't create an array of objects of parameter type
    public T[] vehicles = new T[10];
The code does not compile. The error message says Cannot create a generic array of T
A Java array remembers the type of its elements. So an array of type T should know type T. But there is no type T at runtime!
 If the above code was correct, the type T[] would be erased to its bound type, Vehicle[]. However, elsewhere in the code we could have:
?
1
2
Garage<Car> carGarage = new Garage<Car>();
Car[] cars = carGarage.vehicles;
This code would compile without errors. At runtime carGarage.vehicles would be of typeVehicle[]. We would have a runtime error: carGarage.vehicles type does not match the type of variable cars 

It's because Java's arrays (unlike generics) contain, at runtime, information about its component type. So you must know the component type when you create the array. Since you don't know what T is at runtime, you can't create the array.
Read full article from Java Generics: What Beginners Find Surprising | OneWebSQL

Labels

Review (572) System Design (334) System Design - Review (198) Java (189) Coding (75) Interview-System Design (65) Interview (63) Book Notes (59) Coding - Review (59) to-do (45) Linux (43) Knowledge (39) Interview-Java (35) Knowledge - Review (32) Database (31) Design Patterns (31) Big Data (29) Product Architecture (28) MultiThread (27) Soft Skills (27) Concurrency (26) Cracking Code Interview (26) Miscs (25) Distributed (24) OOD Design (24) Google (23) Career (22) Interview - Review (21) Java - Code (21) Operating System (21) Interview Q&A (20) System Design - Practice (20) Tips (19) Algorithm (17) Company - Facebook (17) Security (17) How to Ace Interview (16) Brain Teaser (14) Linux - Shell (14) Redis (14) Testing (14) Tools (14) Code Quality (13) Search (13) Spark (13) Spring (13) Company - LinkedIn (12) How to (12) Interview-Database (12) Interview-Operating System (12) Solr (12) Architecture Principles (11) Resource (10) Amazon (9) Cache (9) Git (9) Interview - MultiThread (9) Scalability (9) Trouble Shooting (9) Web Dev (9) Architecture Model (8) Better Programmer (8) Cassandra (8) Company - Uber (8) Java67 (8) Math (8) OO Design principles (8) SOLID (8) Design (7) Interview Corner (7) JVM (7) Java Basics (7) Kafka (7) Mac (7) Machine Learning (7) NoSQL (7) C++ (6) Chrome (6) File System (6) Highscalability (6) How to Better (6) Network (6) Restful (6) CareerCup (5) Code Review (5) Hash (5) How to Interview (5) JDK Source Code (5) JavaScript (5) Leetcode (5) Must Known (5) Python (5)

Popular Posts