package com.sf._04_泛型;

/**
 * 泛型类的使用
 * @param <T>
 */
public class MathUtils<T extends Number> {
    private T a;
    private T b;


    public MathUtils() {
    }

    public MathUtils(T a, T b) {
        this.a = a;
        this.b = b;
    }

    /**
     * 获取
     * @return a
     */
    public T getA() {
        return a;
    }

    /**
     * 设置
     * @param a
     */
    public void setA(T a) {
        this.a = a;
    }

    /**
     * 获取
     * @return b
     */
    public T getB() {
        return b;
    }

    /**
     * 设置
     * @param b
     */
    public void setB(T b) {
        this.b = b;
    }

    public String toString() {
        return "MathUtils{a = " + a + ", b = " + b + "}";
    }

    /**
     * 泛型方法
     * @param a
     * @param b
     * @return
     */
    @SuppressWarnings("unchecked") // 抑制unchecked警告（因强制转换）
    public static<T extends Number> T add(T a , T b){
        // 判断类型是double 还是integer
        if( a instanceof Integer && b instanceof Integer){
            //a.intValue() + b.intValue()  把传入a  和 b 转成int 类型
            // Integer.valueOf    d
            return (T) Integer.valueOf(a.intValue() + b.intValue());
        }else if(a instanceof Double && b instanceof Double){
            return (T) Double.valueOf(a.doubleValue() + b.doubleValue());
        }
        return null;
    }

//    @SuppressWarnings("unchecked") // 抑制unchecked警告（因强制转换）
//    public static <T extends Number> T add(T a, T b) {
//        // 核心：将 Number 转为基本类型计算，再转回对应包装类
//        if (a instanceof Integer && b instanceof Integer) {
//            return (T) Integer.valueOf(a.intValue() + b.intValue());
//        } else if (a instanceof Double && b instanceof Double) {
//            return (T) Double.valueOf(a.doubleValue() + b.doubleValue());
//        } else if (a instanceof Long && b instanceof Long) {
//            return (T) Long.valueOf(a.longValue() + b.longValue());
//        } else {
//            // 其他数值类型（如 Float、Short）可按需扩展
//            throw new IllegalArgumentException("不支持的数值类型");
//        }
//    }
}
