20-2: JAVA wildcard

jk·2024년 1월 26일
0

kdt 풀스택

목록 보기
38/127



1. 아래가 에러나는 이유를 설명하시오.

class Plastic {}
class Toy extends Plastic {}
class Car extends Toy {}
class Robot extends Toy {}
//
class Box<T> {
	private T ob;
//
	public void set(T o) { ob = o; }
	public T get() { return ob; }
//
	public static void inBox(Box<? super Toy> box, Toy n) {
			box.set(n); // 넣는 것! OK!
			Toy myToy = box.get(); // 꺼내는 것! Error!
	}
}
  • The type of "Box" is "Toy" or one of parent classes of "Toy".
  • The "myToy" has memory number of its parent "Box" already, but the "Box" from box.get() is not the parent instance of "myToy".
  • So auto casting doesnt occur from box.get() to "myToy".
  • So javac is not able to compile this code.



2.​아래의 소스코드 중에 System.out.println(zBox.get().get().get()); 부분을 설명하시오.

class Box<T> {
	private T ob;
//
	public void set(T o) {
		ob = o;
	}
//
	public T get() {
		return ob;
	}
}
//
//
public class BoxInBox {
	public static void main(String[] args) {
//
		Box<String> sBox = new Box<>(); //Box<T>에 데이터타입을 String으로 결정
		sBox.set("I am so happy."); //sBox set함수에 문자열 set
//
		Box<Box<String>> wBox = new Box<>(); //Box<T>에 데이터타입을 Box<String>으로 결정
		wBox.set(sBox); //sBox의 값을 wBox값으로 set
//
		Box<Box<Box<String>>> zBox = new Box<>(); //Box<T>에 데이터타입을 Box<Box<String>>으로 결정
		zBox.set(wBox);  //wBox의 값을 zBox값으로 set
//
		System.out.println(zBox.get().get().get()); //-> 이부분을 설명하세요.
        //zBox의 get함수 호출 시  zBox의 값은 wBox에서 가져왔으므로 한번 더 .get()을 해주고
        //wBox의 값은 sBox에서 가져왔으므로 한번 더 .get()을 해준 것이다. 
	}
}
/*출력값 
I am so happy.
*/
  • unboxing 3 times.



3. 와일드 카드와 상한 제한, 하한 제한에 대하여 설명하시오.

  • Generic<? extends T> generic : The type is not allowed to be parent class of T. But, (generic instanceof T) = true .
  • Generic<? super T> generic : The type is not allowed to be child class of T. But, (t instanceof Generic) = true .



4. 아래와 같이 메소드 오버로딩이 되지 않는 이유는?

   public static void outBox(Box<? extends Toy> box) {...}
   public static void outBox(Box<? extends Robot> box) {...}
  • Generic is defined during compiling.
  • So defined method doesnt care the generic anymore.
  • The two methods are already same without generic keywords.
  • So javac is not able to compile this code.
profile
Brave but clumsy

0개의 댓글