본디 폴리모피즘에서 추구한 방식 즉 파라메트릭 방식에 의하면 상기의 식을 적용할 때 동적 캐스팅이 필요가 없어야한다.
자 스포츠 카에 터보엔진이 달렸다는 발상을 해보자.
~cpp
Car sportCar = getCar("young man");
sportCar.startTurboEngine();
어떨까?
당연히 에러가 난다. 터보엔진은 스포츠 카에 달린 것이지 Car라는 객체에는 존재하지 않기 때문이다.
그렇다면 다음은?
~cpp
SportCar sportCar = getCar("young man");
sportCar.startTurboEngine();
역시 에러가 난다.
SportCar에 대입되는 getCar():Car는
SportCar보다 상위의 개념은 Car이기 때문이다.
이를 해결한 코드는 다음과 같다.
~cpp
SportCar sportCar = (SportCar) getCar("young man");
sportCar.startTurboEngine();
에러는 피했다. 하지만 우리가 그리도 바라마지 않던 품격의 객체지향 언어가 너덜너덜한 표현법을 쓴다.
본디 파라메트릭 폴리몰피즘은 상기와 같은 문제의 해결을 위해서 방어적 수단을 제공한다.
무엇인고 하니, 바로 리턴해야할 객체의 타입을 인수로 준다는 개념이다. (C++의 템플릿 같지?)
위와 같은 개념의 코드로 작성이 되면 동적 캐스팅이 필요 없을뿐만아니라 잘못된 타입 캐스팅으로 인한
에러역시 방지할 수 잇다.
최근 자바 5 에서는 generics 라는 기능을 도입함으로서 파라메트릭 폴리모피즘을 지원하기 시작했다.
generics에 대한 예제
~cpp
class Pair<SomeObjectType>
{
SomeObjectType x, y;
Pair(SomeObjectType x, SomeObjectType y)
{
this.x = x;
this.y = y;
}
SomeObjectType getFirstObject (Pair<SomeObjectType> p)
{
return p.x;
}
}
상기와 같은 방식으로 작성하게 되면 다음과 같이 특정한 데이터 형에 구애 받지 않는
로직이 작성된다.
~cpp
Pair<Integer> p;
p = new Pair<Integer>(new Integer(0), new Integer(1));
Integer x = p.getFirstObject(p);
Pair<Boolean> p;
p = new Pair<Boolean>(new Boolean(0), new Boolean(1));
Boolean x = p.getFirstObject(p);
.
.
.
.
이렇게 파라메트릭 폴리모피즘을 도입함으로서 좀더 우아한 코드가 완성된다.