본문 바로가기

JAVA

제네릭 타입제한과 필드에서의 값 전달 (feat : 계산기 과제)

제네릭 타입 제한

  • 제네릭 타입 제한은 클래스, 메서드, 인터페이스 선언 부분에서만 가능함
public class Calculator<T extends Number> {
    private final List<T> resultList = new ArrayList<>(); // T는 Number의 하위 타입
}

 

  • 클래스에서 T의 제한을 걸면, 타입의 제한이 클래스 내부 전체에 걸림
public class Calculator<T extends Number> {
    private final List<T> resultList = new ArrayList<>(); // T는 Number의 하위 타입
}

 

-> 지난번에 내가 과제에서 수행했던 것처럼 메서드 수준에서 제네릭 제한을 걸어버리면, results 에 타입을 Number로 지정해서 해결했어야 했음

 

지난번 짠 코드

private List<Double> results = new ArrayList<>();

    public <T extends Number> Double calculate(T firstInput, T secondInput, String operator) throws DivideByZeroException {
        double answer = switch (operator) {
            case "+" -> OperatorType.PLUS.calculate(firstInput, secondInput);
            case "-" -> OperatorType.MINUS.calculate(firstInput, secondInput);
            case "*" -> OperatorType.MULTIPLY.calculate(firstInput, secondInput);
            case "/" -> OperatorType.DIVIDE.calculate(firstInput, secondInput);
            default -> throw new IllegalArgumentException("Invalid operator: " + operator);
        };

        results.add(answer);
        return answer;
    }

 

results 타입을 Number로 지정해서 해결

public class Calculator {
    private final List<Number> resultList = new ArrayList<>();

    public <T extends Number> void addResult(T result) {
        resultList.add(result); // T는 Number의 하위 타입
    }
}

 

필드 타입이 제네릭이라면 값을 지정해 줄 때에도 제네릭으로 전달

  • Double 값 자체로 값을 넣어서 전달해버리면 'add(T)' in 'java.util.List' cannot be applied to '(java.lang.Double)' 에러 발생
public class Calculator <T extends Number>{
    private final List<T> resultList = new ArrayList<>();

    public Double calculate(){
        Double a = 10.0;
        resultList.add(a);
        return a;
    }
    
}

 

  • 제네릭 타입으로  값을 전달해줘야 함
  • resultList.add((T)10.0); -> 불가 타입이 명확해야 Number의 하위 타입인 제네릭이라고 판단 할 수 있음 
public class Calculator <T extends Number>{
    private final List<T> resultList = new ArrayList<>();

    public Double calculate(){
        Double a = 10.0;
        String b = "sdfsaf";
        resultList.add((T)a);
        return a;
    }

    public List<T> getResult() {
        return resultList;
    }
}

 

결론적으로 제네릭타입의 필드로 컬렉션 프레임워크를 명시를 해줬으면, 해당 컬렉션에 접근할 때도 제네릭으로 접근해야 한다!