# जेनरिक्स बुनियाद — कोर जावा

Source: https://www.geekswithgeeks.com/hi/core-java/java-generics-basics

> अपनी क्लास व मेथड में टाइप पैरामीटर जोड़ें ताकि कम्पाइलर हर उपयोग जाँचे और मान वापस पढ़ते समय कभी cast न करना पड़े।

## एक जेनरिक क्लास

टाइप पैरामीटर `<T>` एक प्लेसहोल्डर है जिसे कॉलर भरता है। कम्पाइलर हर उपयोग जाँचता है।

```java
class Box<T> {
    private T item;
    void put(T item) { this.item = item; }
    T get() { return item; }
}

Box<String> b = new Box<>();
b.put("hi");
String s = b.get();   // no cast
```

## जेनरिक मेथड

एक मेथड अपना खुद का टाइप पैरामीटर घोषित कर सकता है, चाहे वह किसी भी क्लास में हो। कम्पाइलर पास किए गए आर्ग्युमेंट से `T` तय करता है।

```java
static <T> T firstOf(List<T> items) {
    return items.get(0);
}

String s = firstOf(List.of("a", "b"));   // T inferred as String
Integer n = firstOf(List.of(1, 2, 3));   // T inferred as Integer
```

## सीमाबद्ध टाइप पैरामीटर

`<T extends Comparable<T>>` `T` को उन टाइप तक सीमित करता है जो comparable हों, ताकि मेथड बॉडी `T` के मानों पर `compareTo` बुला सके। यहाँ `extends` क्लास व इंटरफ़ेस दोनों के लिए "सबटाइप है" का मतलब रखता है।

```java
static <T extends Comparable<T>> T max(T a, T b) {
    return a.compareTo(b) >= 0 ? a : b;
}

max(3, 7);        // 7
max("pear", "fig"); // "pear"
```
