// Parent.java
public class Parent<T, M> {
private kind;
private model;
public void setKind(T kind) { this.kind = kind; }
public void setModel(M model) { this.model = model; }
public T getKind() { return kind; }
public M getModel() { return model; }
}
class Tv{}
// Child.java
public class Child<T, M, C> extends Parent<T, M> {
private C company;
public void setCompany(C company) { this.company = company; }
public C getCompany() { return company; }
}
// interface Storage
public interface Storage<T> {
public void add(T item, int index); // 추상 메소드
public T get(int index);
}
// 구현 클래스 StorageImpl.java
public class StorageImpl<T> implements Storage<T> {
private T[] array;
public StorageImpl(int capacity) { // 초기화할 생성자.
this.array = (T[]) (new Object[capacity]); // 타입 파라미터로 배열을 생성하려면 new T[n] 형태로 생성할 수 없고 (T[])(new Object[n]으로 생성해야 한다.
}
@Override
public void add(T item, int index) {
array[index] = item;
}
@Override
public T get(int index) {
return array[index];
}
}
Child<T, M, C>와 StorageImpl<T>를 사용하는 클래스
// Main.java
public class Main {
public static void main(String[] args) {
Child<Tv, String, String> product = new Child<Tv, String, String>();
// 첫번째 타입 파라미터로 Tv 타입이 들어가야하고, Tv 타입은 Parent의 kind 필드를 결정한다.
product.setKind(new Tv()); // kind 필드를 Tv 타입 객체로 넣는다.
product.setModel("Smart Tv");
product.setCompany("Samsung");
Storage<Tv> storage = new StorageImpl<Tv>(100); // Tv 타입 객체 100개 list를 만든다.
storage.add(new Tv(), 0); // array 0번째에 Tv 객체를 넣는다.
Tv tv = storage.get(0); // 0번째가 Tv 객체이기 때문에 Tv 타입으로 저장한다.
}
}
'개발 관련 지식 > JAVA' 카테고리의 다른 글
람다식에서 클래스 멤버와 로컬 변수 사용 (0) | 2020.04.07 |
---|---|
람다식 (0) | 2020.04.07 |
제한된 타입 파라미터 (0) | 2020.04.06 |
제네릭 메소드 (0) | 2020.04.06 |
제네릭 (0) | 2020.04.06 |