개발자 미니민의 개발스터디

[JAVA] 자바 - 제네릭 상속 관계 (ex. Number - Integer)

by mini_min

[JAVA]
자바 - 제네릭 상속 관계

 

✔️ 제네릭 상속 (매개변수 관계)

제네릭에서 타입 매개변수에 상속관계가 성립한다. (어떤 타입 매개변수를 가진 제네릭 클래스에서는 상속관계가 성립안된다.)

💡 제네릭 클래스를 상속 받는 하위 클래스는 상위 클래스의 파라미터 타입을 기술해야하며, 추가 타입 파라미터를 가질 수 있다. (인터페이스도 마찬가지)

 

class Test7{
public <U extends Number> void disp(U u) {
	System.out.println(u.getClass().getName() + ", " + u);
	}
}
💡 <U extends Number>
제너릭은 메소드도 만들 수 있는데, 위에서 <U extends Number> 의 뜻은 Number 클래스를 상속하는, 즉 '자식'이 될 수 있는 클래스의 매개변수가 아니면 해당 메소드를 사용할 수 없다는 뜻이다.

ex) Integer 는 Number 클래스의 자식(=상속관계) 이므로 t.disp(30); 으로 호출 가능하다.

 

 

 

◾ 상속 (Number 클래스, Integer 클래스) 

class Test1<T>{
	private T t;
	
	public void set(T t) {
		this.t = t;
	}
	
	public T get() {
		return t;
	}
}

public static void main(String[] args) {
	Test1<Number> t1 = new Test1<>();
    Integer i = 30;
    t1.set(i);
    Number n = t1.get();
    //30 출력
💡 Integer 클래스는 Number 클래스를 상속받는다. 따라서 타입 매개변수의 상속 관계 성립!
t1.set(30); 메소드 실행가능하다.

 

//Integer i2 = t1.get(); 	//컴오류. get 넘버이다.
Integer i2 = (Integer)t1.get();	//다운캐스팅 해야함.
💡 get() 메소드는 Integer 클래스의 상위 클래스인 Number 클래스의 메소드니까 다운 캐스팅 해줘야함.

 

 

 

✔️ 제네릭 클래스의 상속관계X

어떤 타입 매개변수를 가진 제네릭 클래스의 상속관계는 성립하지 않는다.

가령, t2 가 Test1<Integer> 제네릭 클래스일 때, Test1<Number> 제네릭 클래스인 t3 와 상속 관계가 될 수 없다.

 

Test1<Number> t3 = t2;
//컴파일 오류. 제너릭은 상속관계가 될 수 없다.
💡 Number와 Integer 클래스는 상속 관계지만, 제네릭 클래스 끼리 상속관계를 가질 수 없다. 

 

 

 

 

 

블로그의 정보

개발자 미니민의 개발로그

mini_min

활동하기