왜 제한을 해야하죠?
- 제네릭 자료형을 제한함으로써 무작위 클래스가 들어가는 것을 방지할 수 있다.
- 예를 들어, 3D프린터의 재료에 Water 클래스를 넣는 것을 방지할 수 있다.
- 상위 클래스에서 선언하거나 정의하는 메소드를 활용할 수 있다.
선언 및 구현
- Material 클래스를 상속받은 클래스만 제네릭 자료형에 들어갈 수 있다.
<T extends 클래스>
를 사용하여 제한한다.
public abstract class Material {
public abstract void doPrinting();
}
public class Powder extends Material{
public void doPrinting() {
System.out.println("Powder 재료로 출력합니다");
}
public String toString() {
return "재료는 Powder 입니다";
}
}
public class Plastic extends Material{
public void doPrinting() {
System.out.println("Plastic 재료로 출력합니다");
}
public String toString() {
return "재료는 Plastic 입니다";
}
}
public class GenericPrinter<T extends Material> {
private T material;
public void setMaterial(T material) {
this.material = material;
}
public T getMaterial() {
return material;
}
public String toString(){
return material.toString();
}
public void printing() {
material.doPrinting();
}
}
public class GenericPrinterTest {
public static void main(String[] args) {
GenericPrinter<Powder> powderPrinter = new GenericPrinter<Powder>();
powderPrinter.setMaterial(new Powder());
Powder powder = powderPrinter.getMaterial();
System.out.println(powderPrinter);
GenericPrinter<Plastic> plasticPrinter = new GenericPrinter<Plastic>();
plasticPrinter.setMaterial(new Plastic());
Plastic plastic = plasticPrinter.getMaterial();
System.out.println(plasticPrinter);
}
}