제네릭 타입 제한
- 제네릭 타입 제한은 클래스, 메서드, 인터페이스 선언 부분에서만 가능함
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;
}
}
결론적으로 제네릭타입의 필드로 컬렉션 프레임워크를 명시를 해줬으면, 해당 컬렉션에 접근할 때도 제네릭으로 접근해야 한다!
'JAVA' 카테고리의 다른 글
키오스크 만들기 : 음식 메뉴와 카테고리를 클래스로 관리하기 (0) | 2025.01.16 |
---|---|
객체지향적인 계산기 만들기 : 멘토님 코드와 나의 코드간의 개선점 비교 (0) | 2025.01.13 |
Enum 및 예외처리를 적용한 계산기 만들기 (0) | 2025.01.10 |
Lambda & Stream을 이용하여 특정 값보다 큰 값들만 조회하기 (0) | 2025.01.09 |
제네릭을 활용한 Double타입 계산이 가능한 계산기 만들기 (0) | 2025.01.08 |