Generic Types
CS 240: Advanced Software Construction
Generics Overview
Generic Class Example
public class Pair<T, U> {
private T value1;
private U value2;
public Pair(T value1, U value2) {
this.value1 = value1;
this.value2 = value2;
}
public T getValue1() {
return value1;
}
public void setValue1(T value1) {
this.value1 = value1;
}
public U getValue2() {
return value2;
}
public void setValue2(U value2) {
this.value2 = value2;
}
}
Instantiating a Generic Class
Pair<String, Integer> pair1 = new Pair<String, Integer>("Hello", 123);
Pair<String, Integer> pair2 = new Pair<>("Hello", 123);
var pair3 = new Pair<String, Integer>("Hello", 123);
Old way with redundant type declaration
More concise way (diamond syntax)
Even more concise way (var syntax)
Using Generic Classes
Inheritance and Interface Implementation
Inheriting from a Generic Class
Specify types in extends clause:
public class StringPair extends Pair<String, String> {
public StringPair(String value1, String value2) {
super(value1, value2);
}
}
Can pass generic types from a generic subclass:
public class KeyValuePair<V> extends Pair<String, V> {
public KeyValuePair(String value1, V value2) {
super(value1, value2);
}
}
Instantiate without declaring generic types:
StringPair p = new StringPair(“Hello”, “BYU”);
Instantiate by declaring a type for V:
KeyValuePair<Date> pair4 =
new KeyValuePair<>("Hello", new Date());
Using a Generic Interface
public interface Function<T, R> {
R apply(T param);
}
public class Capitalizer implements
Function<String, String> {
@Override
public String apply(String param) {
return param == null ? null :
param.toUpperCase();
}
}
public class StringManipulator {
public String manipulateString(String str,
Function<String, String> manipulationFunction) {
return manipulationFunction.apply(str);
}
}
public static void main(String[] args) {
Function<String, String> cap = new Capitalizer();
var sm = new StringManipulator();
String s = sm.manipulateString(args[0], cap);
}
Generic Type Wildcards
Generic Type Wildcards
public class GenericClassExample<T> {
public void method1(List<? super T> param) {};
public void method2(List<? extends T> param) {};
public T method3() { return null;}
}