🔹 1. Introduction
Generics are one of the most powerful features of
both Java and TypeScript, allowing developers to write flexible
and type-safe code. Generics enable functions, classes, and interfaces to
work with multiple data types without sacrificing type safety.
While their syntax and usage are quite similar across Java
and TypeScript, there are important differences in type constraints, inference,
and runtime behavior that developers should understand. This chapter
explores the generics system of both languages in depth.
🔹 2. Basic Syntax of
Generics
✅ Java Generic Method:
public
class GenericExample {
public static <T> void printArray(T[]
array) {
for (T item : array) {
System.out.println(item);
}
}
}
✅ TypeScript Generic Function:
function
printArray<T>(arr: T[]): void {
arr.forEach(item => console.log(item));
}
✅ Both use the angle bracket
syntax <T>, which is a placeholder for a type.
🔹 3. Generic Classes
✅ Java:
class
Box<T> {
private T value;
public void set(T value) { this.value =
value; }
public T get() { return value; }
}
✅ TypeScript:
class
Box<T> {
private value: T;
constructor(value: T) {
this.value = value;
}
getValue(): T {
return this.value;
}
}
✅ You can create an object with a
specific type:
Box<String>
stringBox = new Box<>();
const
stringBox = new Box<string>("Hello");
🔹 4. Multiple Generic
Types
✅ Java:
class
Pair<K, V> {
K key;
V value;
}
✅ TypeScript:
class
Pair<K, V> {
key: K;
value: V;
constructor(key: K, value: V) {
this.key = key;
this.value = value;
}
}
✅ Both allow defining multiple
types generically.
🔹 5. Type Constraints
✅ Java (Bounded Types):
class
NumberBox<T extends Number> {
T value;
}
✅ TypeScript (Type Constraint):
function
getLength<T extends { length: number }>(item: T): number {
return item.length;
}
✅ Both languages support
restricting generic types to those that satisfy specific criteria.
🔹 6. Wildcards vs. any
vs. Unknown
|
Concept |
Java |
TypeScript |
|
Wildcard |
<?> |
any or
unknown |
|
Safe generic |
T extends
Number |
T extends
Number |
|
Unbounded
generic |
<?> |
T
(unconstrained) |
✅ Java Wildcard Example:
List<?>
list = new ArrayList<String>();
✅ TypeScript any / unknown:
let
data: any;
let
safeData: unknown;
🔸 Use unknown for safety;
avoid any when possible.
🔹 7. Type Inference
Both Java and TypeScript can infer generic types:
✅ Java:
List<String>
list = Arrays.asList("a", "b", "c");
✅ TypeScript:
let
items = ["a", "b", "c"]; // inferred as string[]
✅ You can also explicitly pass
types when inference fails:
let
ids = identity<number>(123);
🔹 8. Type Erasure
✅ Java:
Java erases generic type information at runtime.
List<String>
list = new ArrayList<>();
List<Integer>
list2 = new ArrayList<>();
System.out.println(list.getClass()
== list2.getClass()); // true
✅ TypeScript:
TypeScript strips types entirely at compile time
because JavaScript doesn’t support them.
function
identity<T>(value: T): T {
return value;
}
✅ Type checking is only at
compile time — no generics at runtime.
🔹 9. Generic Interfaces
✅ Java:
interface
Printer<T> {
void print(T value);
}
✅ TypeScript:
interface
Printer<T> {
print(value: T): void;
}
✅ Both allow defining contracts
over a type.
🔹 10. Summary Table
|
Feature |
Java
Example |
TypeScript
Example |
|
Generic
Function |
<T>
void print(T[] arr) |
<T>
function print(arr: T[]) |
|
Generic Class |
class
Box<T> |
class
Box<T> |
|
Multiple
Types |
class
Pair<K, V> |
class
Pair<K, V> |
|
Bounded Types |
T extends
Number |
T extends
Number |
|
Wildcards |
List<?> |
any or
unknown |
|
Inference |
List.of("a",
"b") |
["a",
"b"] |
|
Runtime
Typing |
Erased (no
info at runtime) |
Removed
during compilation |
|
Interface
Support |
interface
Printer<T> |
interface
Printer<T> |
No — TypeScript is a superset of JavaScript. However, many of its features (like classes, interfaces, and typing) are inspired by Java and C#.
No. Java is compiled into bytecode for the JVM, whereas TypeScript compiles to JavaScript for browser or Node.js environments.
✅ Yes — both use interfaces for contracts, but TypeScript interfaces are erased at runtime.
Java is strictly statically typed. TypeScript adds optional static typing to JavaScript.
✅ Yes — syntactically very similar, but TypeScript compiles to JavaScript, so it's ultimately prototype-based under the hood.
Kind of — TypeScript supports method overload signatures, but only one implementation
✅ Yes — TypeScript uses implements for interfaces and extends for class inheritance.
✅ Yes — especially on the front-end (Angular), but for heavy-duty back-end logic, Java is still preferred.
Very similar — both allow defining reusable components and data structures with type constraints.
✅ Absolutely. It’s one of the most in-demand languages today, especially for full-stack roles.
Tutorials are for educational purposes only, with no guarantees of comprehensiveness or error-free content; TuteeHUB disclaims liability for outcomes from reliance on the materials, recommending verification with official sources for critical applications.
Kindly log in to use this feature. We’ll take you to the login page automatically.
LoginReady to take your education and career to the next level? Register today and join our growing community of learners and professionals.
Your experience on this site will be improved by allowing cookies. Read Cookie Policy
Your experience on this site will be improved by allowing cookies. Read Cookie Policy
Comments(0)