AVA-Generics(3)
ムカデ類を使用したオブジェクトの作成
class Box<T>{
ArrayList<T> list = new ArrayList<T>();
void add(T item) { list.add(item); }
T get(int i) { return list.get(i); }
ArrayList<T> getList() { return list; }
int size() { return list.size(); }
public String toString(){ return list.toString(); }
}
Box<T>의 객체를 생성할 때는 다음과 같이 한다. 참조변수와 생성자에 대입된 타입이 일치해야 한다.
Box<Apple> appelBox = new Box<Apple>(); //ok
Box<Apple> appleBox = new Box<Grape>(); //에러
두 타입이 상속관계에 있어도 마찬가지이다. Apple이 Fruit 의 자손이라고 가정하자.
Box<Fruit> appelBox = new Box<Apple>(); //에러, 대입된 타입이 다르다.
단, 두 지네릭 클래스의 타입이 상속관계에 있고, 대입된 타입이 같은 것은 괜찮다.
FruitBox는 Box의 자손이라고 가정하자.
Box<Apple> appleBox = new FruitBox<Apple>(); //ok. 다형성
Box<T>의 객체에 'void add(T item)'으로 객체를 추가할 때, 대입된 타입과 다른 타입의
객체는 추가할 수 없다.
Box<Apple> appleBox = new Box<Apple>();
appleBox.add(new Apple()); //ok
appleBox.add(new Grape()); //에러 Apple객체만 추가 가능
그러나 타입 T가 'Fruit'인 경우, 'void add(Fruit item)'가 되므로
Fruit의 자손들은 이 메서드의 매개변수가 될 수 있다. Apple이 Fruit의 자손이라고 가정
Box<Fruit> fruitBox = new Box<Fruit>();
fruitBox.add(new Fruit()); //ok.
fruitBox.add(new Apple()); //ok, void add(Fruit item)
예제)
import java.util.ArrayList;
class Fruit {public String toString() { return "Fruit";}}
class Apple extends Fruit {public String toString() { return "Apple";}}
class Grape extends Fruit {public String toString() { return "Grape";}}
class Toy {public String toString() { return "Toy"; }}
class FruitBoxEx1{
public static void main(String[] args)
{
Box<Fruit> fruitBox = new Box<FruitBox>();
Box<Apple> appleBox = new Box<AppleBox>();
Box<Toy> toyBox = new Box<Toy>();
// Box<Grape> grapeBox = new Box<Apple>(); //에러, 타입 불일치
fruitBox.add(new Fruit());
fruitBox.add(new Apple()); //ok, void add (Fruit item)
appleBox.add(new Apple());
appleBox.add(new Apple());
// appleBox.add(new Toy()); //에러 Box<Apple>에는 Apple만 담을 수 있음
toyBox.add(new Toy());
// toyBox.add(new Apple()); //에러 Box<Toy>에는 Apple만 담을 수 없음
System.out.println(fruitBox);
System.out.println(appleBox);
System.out.println(toyBox);
//main 끝
}
}
class Box<T>{
ArrayList<T> list = new ArrayList<T>();
void add(T item) { list.add(item); }
T get(int i) { return list.get(i); }
int size() { return list.size(); }
public String toString() { return list.toString(); }
}
실행결과
[Fruit, Apple]
[Apple, Apple]
[Toy]
Reference
この問題について(AVA-Generics(3)), 我々は、より多くの情報をここで見つけました https://velog.io/@jo_dbsgh95/JAVA-지네릭스Generics-3テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol