From 5971b4d791db2e1ccea8d3305998399115af1fa9 Mon Sep 17 00:00:00 2001 From: apeterlic Date: Mon, 12 Dec 2022 08:35:27 +0100 Subject: [PATCH] Add Type Parameter vs Wildcard in Java Generics (#12988) * Add Type Parameter vs Wildcard in Java Generics * Fix Logger variable and code format * Update Cat class * Add missing import * Add warning comment --- .../java/com/baeldung/generics/Animal.java | 22 ++++++++ .../com/baeldung/generics/AnimalDemo.java | 26 +++++++++ .../main/java/com/baeldung/generics/Cat.java | 41 ++++++++++++++ .../baeldung/generics/CollectionUtils.java | 56 +++++++++++++++++++ .../generics/CollectionUtilsDemo.java | 48 ++++++++++++++++ .../main/java/com/baeldung/generics/Dog.java | 14 +++++ 6 files changed, 207 insertions(+) create mode 100644 core-java-modules/core-java-lang-5/src/main/java/com/baeldung/generics/Animal.java create mode 100644 core-java-modules/core-java-lang-5/src/main/java/com/baeldung/generics/AnimalDemo.java create mode 100644 core-java-modules/core-java-lang-5/src/main/java/com/baeldung/generics/Cat.java create mode 100644 core-java-modules/core-java-lang-5/src/main/java/com/baeldung/generics/CollectionUtils.java create mode 100644 core-java-modules/core-java-lang-5/src/main/java/com/baeldung/generics/CollectionUtilsDemo.java create mode 100644 core-java-modules/core-java-lang-5/src/main/java/com/baeldung/generics/Dog.java diff --git a/core-java-modules/core-java-lang-5/src/main/java/com/baeldung/generics/Animal.java b/core-java-modules/core-java-lang-5/src/main/java/com/baeldung/generics/Animal.java new file mode 100644 index 0000000000..fd247a4eff --- /dev/null +++ b/core-java-modules/core-java-lang-5/src/main/java/com/baeldung/generics/Animal.java @@ -0,0 +1,22 @@ +package com.baeldung.generics; + +abstract class Animal { + + protected final String type; + protected final String name; + + protected Animal(String type, String name) { + this.type = type; + this.name = name; + } + + abstract String makeSound(); + + public String getType() { + return type; + } + + public String getName() { + return name; + } +} \ No newline at end of file diff --git a/core-java-modules/core-java-lang-5/src/main/java/com/baeldung/generics/AnimalDemo.java b/core-java-modules/core-java-lang-5/src/main/java/com/baeldung/generics/AnimalDemo.java new file mode 100644 index 0000000000..3d33180fa3 --- /dev/null +++ b/core-java-modules/core-java-lang-5/src/main/java/com/baeldung/generics/AnimalDemo.java @@ -0,0 +1,26 @@ +package com.baeldung.generics; + +import java.util.ArrayList; +import java.util.List; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +class AnimalDemo { + + private static final Logger logger = LoggerFactory.getLogger(AnimalDemo.class); + + public static void main(String[] args) { + List cats = new ArrayList<>(); + cats.add(new Cat("Persian", "Bono")); + cats.add(new Cat("Egyptian", "Lulu")); + cats.add(new Cat("Siamese", "Ra")); + + order(cats); + logger.info("Ordered cats: {}", cats); + } + + public static > void order(List list) { + list.sort(Comparable::compareTo); + } +} diff --git a/core-java-modules/core-java-lang-5/src/main/java/com/baeldung/generics/Cat.java b/core-java-modules/core-java-lang-5/src/main/java/com/baeldung/generics/Cat.java new file mode 100644 index 0000000000..bb6f9ba8f0 --- /dev/null +++ b/core-java-modules/core-java-lang-5/src/main/java/com/baeldung/generics/Cat.java @@ -0,0 +1,41 @@ +package com.baeldung.generics; + +import java.util.Objects; + +class Cat extends Animal implements Comparable { + public Cat(String type, String name) { + super(type, name); + } + + @Override + public String makeSound() { + return "Meow"; + } + + /** + * Warning: Inconsistent with the equals method. + */ + @Override + public int compareTo(Cat cat) { + return this.getName().length() - cat.getName().length(); + } + + @Override + public String toString() { + return "Cat{" + "type='" + type + '\'' + ", name='" + name + '\'' + '}'; + } + + @Override + public int hashCode() { + return Objects.hash(type, name); + } + + @Override + public boolean equals(Object o) { + if(o == this) return true; + if(!(o instanceof Cat)) return false; + Cat cat = (Cat) o; + return type.equals(cat.type) && name.equals(cat.name); + } + +} diff --git a/core-java-modules/core-java-lang-5/src/main/java/com/baeldung/generics/CollectionUtils.java b/core-java-modules/core-java-lang-5/src/main/java/com/baeldung/generics/CollectionUtils.java new file mode 100644 index 0000000000..6d84f5199b --- /dev/null +++ b/core-java-modules/core-java-lang-5/src/main/java/com/baeldung/generics/CollectionUtils.java @@ -0,0 +1,56 @@ +package com.baeldung.generics; + +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +public class CollectionUtils { + + private CollectionUtils() { + } + + public static void print(T item) { + System.out.println(item); + } + + public static void swap(List list, int src, int des) { + swapHelper(list, src, des); + } + + private static void swapHelper(List list, int src, int des) { + list.set(src, list.set(des, list.get(src))); + } + + public static List mergeTypeParameter(List listOne, List listTwo) { + return Stream.concat(listOne.stream(), listTwo.stream()) + .collect(Collectors.toList()); + } + + public static List mergeWildcard(List listOne, List listTwo) { + return Stream.concat(listOne.stream(), listTwo.stream()) + .collect(Collectors.toList()); + } + + public static long sum(List numbers) { + return numbers.stream() + .mapToLong(Number::longValue) + .sum(); + } + + public static long sumTypeParameter(List numbers) { + return numbers.stream() + .mapToLong(Number::longValue) + .sum(); + } + + public static long sumWildcard(List numbers) { + return numbers.stream() + .mapToLong(Number::longValue) + .sum(); + } + + public static void addNumber(List list, Integer number) { + list.add(number); + } + +} diff --git a/core-java-modules/core-java-lang-5/src/main/java/com/baeldung/generics/CollectionUtilsDemo.java b/core-java-modules/core-java-lang-5/src/main/java/com/baeldung/generics/CollectionUtilsDemo.java new file mode 100644 index 0000000000..012d9a3110 --- /dev/null +++ b/core-java-modules/core-java-lang-5/src/main/java/com/baeldung/generics/CollectionUtilsDemo.java @@ -0,0 +1,48 @@ +package com.baeldung.generics; + +import java.util.ArrayList; +import java.util.List; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +class CollectionUtilsDemo { + + private static final Logger logger = LoggerFactory.getLogger(CollectionUtilsDemo.class); + + public static void main(String[] args) { + CollectionUtils.print("Baeldung"); + + List numbers1 = new ArrayList<>(); + numbers1.add(5); + numbers1.add(10L); + + List numbers2 = new ArrayList<>(); + numbers2.add(15f); + numbers2.add(20.0); + + List numbersMerged = CollectionUtils.mergeTypeParameter(numbers1, numbers2); + logger.info("Merged numbers: {}", numbersMerged); + + List numbers = new ArrayList<>(); + numbers.add(5); + numbers.add(10L); + numbers.add(15f); + numbers.add(20.0); + + logger.info("Sum: {}", CollectionUtils.sum(numbers)); + logger.info("Sum (wildcard): {}", CollectionUtils.sumWildcard(numbers)); + logger.info("Sum (type parameter): {}", CollectionUtils.sumTypeParameter(numbers)); + + List integers = new ArrayList<>(); + integers.add(5); + logger.info("Sum integers (wildcard): {}", CollectionUtils.sumWildcard(integers)); + + CollectionUtils.addNumber(numbers, 4); + CollectionUtils.addNumber(integers, 5); + + logger.info("Before swap: {}", numbers); + CollectionUtils.swap(numbers, 0, 1); + logger.info("After swap: {}", numbers); + } +} diff --git a/core-java-modules/core-java-lang-5/src/main/java/com/baeldung/generics/Dog.java b/core-java-modules/core-java-lang-5/src/main/java/com/baeldung/generics/Dog.java new file mode 100644 index 0000000000..cec6f39422 --- /dev/null +++ b/core-java-modules/core-java-lang-5/src/main/java/com/baeldung/generics/Dog.java @@ -0,0 +1,14 @@ +package com.baeldung.generics; + +public class Dog extends Animal { + + public Dog(String type, String name) { + super(type, name); + } + + @Override + public String makeSound() { + return "Wuf"; + } + +}