본문 바로가기
개발 관련 지식/JAVA

제네릭 타입의 상속과 구현

by 권태일1147 2020. 4. 6.
// 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