<Java>byte与short互相转换

Java短整型与字节型互转

java中文件的读写经常使用byte,但使用经常使用short类型,所以需要使用两种类型转换,byte8位,shot16位,需要进行移位拼接操作。

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;


public class TestMain {
    public static void main(String[] args)
    {
        short[] st_1 = new short[2];
        st_1[0] = 127;
        st_1[1] = 128;
        byte[] bt_1 = new byte[4];
        short[] st_2 = new short[2];
        byte[] bt_2 = new byte[4];

        System.out.println("st_1="+String.valueOf(st_1[0])+String.valueOf(st_1[1]));
        for(int i = 0 ;i < 2;i++)
        {
            bt_1[i*2] = (byte)(st_1[i]);
            bt_1[i*2+1] = (byte)(st_1[i]>>8);
        }




        try {
            File fl = new File("test.txt");
            if(fl.exists());
            else 
            {
                fl.createNewFile();
            }
            FileOutputStream fStream = new FileOutputStream("test.txt");
            fStream.write(bt_1);
            FileInputStream fInputStream = new FileInputStream(fl);


            while(fInputStream.read(bt_2) != -1)
            {

            }

        } catch (Exception e) 
        {
            // TODO: handle exception
        }

        for(int i = 0;i < 2;i++)
        {
            st_2[i] = (short)((bt_2[i*2+1]<<8)|(bt_2[i*2]&0xff));
        }       

        System.out.println("st_2="+String.valueOf(st_2[0])+String.valueOf(st_2[1]));
    }
}

输出结果

st_1=127128
st_2=127128
<think>嗯,用户现在想了解Java泛型中Number的具体数据类型以及它在List中的作用,特别是关于List<Number>的。首先,我需要回顾一下Java中Number类的知识。Number是一个抽象类,位于java.lang包中,它是所有数值包装类的父类,比如Integer、Double、Float等。所以当在泛型中使用List<Number>时,这个列表可以容纳任何Number的子类实例。用户可能对泛型中的类型参数有疑问,比如为什么使用Number而不是具体的子类。这时候需要解释泛型的作用,即提供类型安全,并且允许在编译时检查类型错误。例如,List<Number>可以添加不同类型的数值对象,而List<Integer>只能添加Integer,这样List<Number>更灵活,但可能带来运行时类型的问题。 然后,用户提到的List<Number>的具体数据类型,应该是指这个列表中的元素类型都是Number的子类。需要说明虽然类型参数是Number,但实际存储的是其子类的实例,比如Integer、Double等。但要注意,当从List<Number>中取出元素时,可能需要显式转换,因为编译器只知道它们是Number类型。接下来,用户可能想知道Number在List中的作用。这时候需要强调泛型的好处,比如避免强制类型转换,提高代码的可读性和安全性。例如,使用List<Number>可以直接处理各种数值类型,而不需要为每个类型单独写一个列表。可能还需要比较List<Number>和List<?extends Number>的区别。前者可以添加任何Number子类的元素,而后者作为生产者,只能读取,不能添加(除了null)。但根据之前的引用,比如引用[1],里面提到List<? extendsT>的写操作受限,而List<Number>没有这种限制。另外,用户的问题可能涉及到泛型中的类型擦除,比如在运行时,List<Number>和List<Integer>都会被擦除为List,但编译器会在编译时进行类型检查,防止不安全的操作。例如,引用[4]中提到泛型不同的引用不能互相赋值,比如List<String>和List<Integer>不能互相赋值,这同样适用于List<Number>和其他具体数值类型的列表。 还需要考虑实际应用场景,比如处理多种数值类型的集合时,使用List<Number>可以统一处理,而不需要为每个类型创建不同的列表。例如,计算数值总和时,可以遍历List<Number>,调用每个元素的doubleValue()方法,这样无论元素是Integer还是Double,都可以正确计算。 但用户可能存在的误区是认为List<Number>可以添加任何Number子类的对象,而实际上确实可以,但取出时需要处理可能的类型问题。例如,当添加Integer和Double后,取出时如果直接强制转换为某个子类,可能会抛出ClassCastException。因此,正确的做法是保持元素作为Number处理,使用其通用方法如intValue()、doubleValue()等。最后,总结Number在List<Number>中的作用:提供类型安全的容器,允许存储多种数值类型,统一处理数值操作,同时利用泛型在编译时进行类型检查,减少运行时错误。</think>### Java 泛型中 `List<Number>` 的具体数据类型作用 #### 一、`Number` 类的定义子类 `Number` 是 Java 中所有数值包装类的**抽象父类**,位于 `java.lang` 包中。它定义了数值类型的通用行为,其子类包括: - **整数类型**:`Byte`、`Short`、`Integer`、`Long` - **浮点类型**:`Float`、`Double` - **高精度计算**:`BigInteger`、`BigDecimal` ```java Number numInt = new Integer(10); // 允许向上型 Number numDouble = new Double(3.14); // 允许向上型 ``` #### 二、`List<Number>` 的数据类型 `List<Number>` 表示一个**泛型集合**,其元素必须是 `Number` 类型或其子类的实例。虽然类型参数声明为 `Number`,但实际存储的是具体子类对象: ```java List<Number> numbers = new ArrayList<>(); numbers.add(10); // 自动装箱为 Integer numbers.add(3.14); // 自动装箱为 Double numbers.add(new BigDecimal("100.5")); ``` #### 三、`List<Number>` 的核心作用 1. **类型统一性** 允许存储多种数值类型,统一处理数值操作,例如计算总和: ```java double sum = 0; for (Number num : numbers) { sum += num.doubleValue(); // 调用 Number 的通用方法 } ``` 2. **编译时类型安全** 泛型通过编译时检查确保元素类型合法性,避免运行时错误[^2]: ```java numbers.add("字符串"); // 编译报错,只能添加 Number 及其子类 ``` 3. **减少强制类型转换** 原始 `List` 相比,泛型无需手动转换类型: ```java // 使用泛型 Number first = numbers.get(0); // 直接返回 Number 类型 // 不使用泛型 List rawList = new ArrayList(); Number first = (Number) rawList.get(0); // 需显式转换 ``` #### 四、 `List<? extends Number>` 的对比 | 特性 | `List<Number>` | `List<? extends Number>` | |--------------------|--------------------------------|---------------------------------| | **写入能力** | 支持写入 `Number` 及其子类 | 仅支持写入 `null`(PECS 原则)[^1] | | **读取类型** | 返回 `Number` 类型 | 返回 `Number` 类型(但实际可能为子类) | | **用途** | 存储混合数值类型 | 作为生产者(只读) | #### 五、实际应用场景 1. **多类型数值处理** ```java public static void processNumbers(List<Number> numbers) { numbers.forEach(num -> System.out.println(num.doubleValue())); } ``` 2. **泛型方法中的类型约束** ```java public static <T extends Number> void addToList(List<T> list, T element) { list.add(element); // 确保类型一致性 } ``` --- ### 示例代码 ```java public class NumberListDemo { public static void main(String[] args) { List<Number> numbers = new ArrayList<>(); numbers.add(10); // Integer numbers.add(2.718); // Double numbers.add(new BigDecimal("3.1415926")); // 统一处理数值 numbers.forEach(num -> System.out.println(num.getClass().getSimpleName() + ": " + num) ); } } ``` #### 输出结果: ``` Integer: 10 Double: 2.718 BigDecimal: 3.1415926 ``` ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值