当前位置: 首页 > news >正文

备案用网站建设方案网站建设的方案图片

备案用网站建设方案,网站建设的方案图片,国内十大saas平台,wordpress文章半透明1. 泛型概述:为什么需要泛型? 在Java 5之前,集合类(如ArrayList)只能存储Object类型,使用时需要强制类型转换,容易引发ClassCastException。泛型的引入解决了以下问题: 类型安全&a…

1. 泛型概述:为什么需要泛型?

在Java 5之前,集合类(如ArrayList)只能存储Object类型,使用时需要强制类型转换,容易引发ClassCastException。泛型的引入解决了以下问题:

  • 类型安全:编译时检查类型,避免运行时类型转换错误
  • 代码复用:一套代码可以处理多种数据类型
  • 消除强制类型转换:使代码更简洁、可读性更高

示例对比

// Java 5 之前(非泛型)
List list = new ArrayList();
list.add("hello");
String s = (String) list.get(0); // 需要强制转换// 使用泛型
List<String> list = new ArrayList<>();
list.add("hello");
String s = list.get(0); // 自动类型推断

2. 泛型的基本语法

2.1 泛型类

在类名后使用<T>定义类型参数:

public class Box<T> {private T content;public void setContent(T content) {this.content = content;}public T getContent() {return content;}
}// 使用示例
Box<String> stringBox = new Box<>();
stringBox.setContent("Hello");
Box<Integer> intBox = new Box<>();
intBox.setContent(100);

2.2 泛型方法

在方法返回类型前定义类型参数:

public <T> T getFirstElement(List<T> list) {if (list == null || list.isEmpty()) {return null;}return list.get(0);
}// 使用示例
List<String> names = Arrays.asList("Alice", "Bob");
String first = getFirstElement(names); // 自动类型推断

2.3 泛型接口

public interface Repository<T> {void save(T entity);T findById(int id);
}// 实现示例
public class UserRepository implements Repository<User> {@Overridepublic void save(User user) { /* ... */ }@Overridepublic User findById(int id) { /* ... */ }
}

3. 泛型的高级特性

3.1 类型通配符(Wildcards)

用于处理未知类型的泛型集合:

语法说明示例
<?>无限定通配符(未知类型)List<?>
<? extends T>上界通配符(T或其子类)List<? extends Number>
<? super T>下界通配符(T或其父类)List<? super Integer>

示例:处理不同数值类型的集合

public static double sum(List<? extends Number> numbers) {double sum = 0.0;for (Number num : numbers) {sum += num.doubleValue();}return sum;
}// 使用示例
List<Integer> ints = Arrays.asList(1, 2, 3);
List<Double> doubles = Arrays.asList(1.1, 2.2);
System.out.println(sum(ints));    // 输出 6.0
System.out.println(sum(doubles)); // 输出 3.3

3.2 类型擦除(Type Erasure)

Java泛型在编译后会进行类型擦除,转换为原始类型:

  • 泛型类中的T会被替换为Object(或上界类型)
  • 泛型方法中的类型参数会被移除

示例:编译后的代码

// 源代码
public class Box<T> {private T content;public T getContent() { return content; }
}// 编译后(类型擦除)
public class Box {private Object content;public Object getContent() { return content; }
}

3.3 泛型与数组的限制

由于类型擦除,Java不允许直接创建泛型数组:

// 编译错误!
T[] array = new T[10];// 正确做法:使用Object数组+类型转换
T[] array = (T[]) new Object[10];

4. 泛型实战案例

4.1 实现通用缓存工具类

public class Cache<K, V> {private final Map<K, V> cache = new HashMap<>();public void put(K key, V value) {cache.put(key, value);}public V get(K key) {return cache.get(key);}public void remove(K key) {cache.remove(key);}
}// 使用示例
Cache<String, User> userCache = new Cache<>();
userCache.put("user1", new User("Alice"));
User user = userCache.get("user1");

4.2 构建类型安全的Builder模式

public class PersonBuilder<T extends PersonBuilder<T>> {protected Person person = new Person();public T name(String name) {person.setName(name);return self();}public T age(int age) {person.setAge(age);return self();}protected T self() {return (T) this;}public Person build() {return person;}
}// 子类扩展
public class EmployeeBuilder extends PersonBuilder<EmployeeBuilder> {public EmployeeBuilder department(String department) {((Employee) person).setDepartment(department);return this;}
}// 使用示例
Employee emp = new EmployeeBuilder().name("Bob").age(30).department("IT").build();

4.3 实现通用Comparator

public class GenericComparator<T> implements Comparator<T> {private final Function<T, Comparable> keyExtractor;public GenericComparator(Function<T, Comparable> keyExtractor) {this.keyExtractor = keyExtractor;}@Overridepublic int compare(T a, T b) {return keyExtractor.apply(a).compareTo(keyExtractor.apply(b));}
}// 使用示例
List<Person> people = Arrays.asList(new Person("Alice", 25),new Person("Bob", 30)
);people.sort(new GenericComparator<>(Person::getName)); // 按姓名排序
people.sort(new GenericComparator<>(Person::getAge));  // 按年龄排序

5. 泛型的最佳实践

  1. 命名约定

    • T:通用类型
    • E:集合元素类型
    • K/V:键值对中的键和值
    • N:数字类型
  2. 避免使用原生类型

    // 不推荐
    List list = new ArrayList();
    // 推荐
    List<String> list = new ArrayList<>();
    
  3. 优先使用泛型方法

    // 不推荐
    class Utils {public static void printList(List<Object> list) { ... }
    }
    // 推荐
    public static <T> void printList(List<T> list) { ... }
    
  4. 谨慎使用通配符

    • List<?>:只读操作(不能添加元素)
    • List<? extends T>:生产者(只能读取)
    • List<? super T>:消费者(可以写入)

6. 常见问题解答

Q1:泛型能否用于静态方法?

// 可以!静态方法需要单独声明类型参数
public static <T> T getFirst(List<T> list) { ... }

Q2:如何检查泛型类型?

由于类型擦除,运行时无法直接获取泛型类型:

// 错误方式!
if (obj instanceof List<String>) { ... }// 正确方式:检查原始类型
if (obj instanceof List) { ... }

Q3:泛型与反射如何结合?

可以通过ParameterizedType获取泛型信息:

Type type = myList.getClass().getGenericSuperclass();
if (type instanceof ParameterizedType) {Type[] typeArgs = ((ParameterizedType) type).getActualTypeArguments();Class<?> clazz = (Class<?>) typeArgs[0];System.out.println("泛型类型: " + clazz.getName());
}

7. 总结

Java泛型是提升代码安全性可重用性的强大工具。关键要点:

  • 使用泛型类/方法/接口避免重复代码
  • 通配符(<?>, <? extends T>, <? super T>)提供灵活的API设计
  • 理解类型擦除机制,避免运行时类型问题
  • 结合设计模式(如Builder、Factory)发挥泛型最大价值

进一步学习

  • Oracle官方泛型教程
  • 《Effective Java》第5章:泛型
  • TypeToken(Gson)解决类型擦除问题

你在使用泛型时遇到过哪些问题?欢迎在评论区讨论! 🚀

http://www.yayakq.cn/news/634499/

相关文章:

  • 网站开发未来发展趋势html代码大全初学者必备
  • 网站服务器宽带网站不备案有什么影响
  • 云南网站制作怎么计费深圳网站建设公司小江
  • 国内十大网站排名烟台企业网站制作公司
  • 上海网站开发孵化类似谷德设计网的网站
  • 范县网站建设北京海淀互联网公司
  • 手机建网站 教程网络协议分析课程设计报告
  • 九号线香网站建设wordpress文章背景
  • 免费网站推广工具有哪些嘉兴seo关键词优化
  • 免费永久网站空间wordpress检查后门
  • 做网站代码第一不网站在互联网营销中的作用
  • wordpress 本地上传服务器网站优化种类
  • 成都便宜网站建设怎样做多商户网站
  • 用网站做淘宝客怎么样外贸网站推广运营
  • 扬中会建网站重庆通信管理局网站
  • 做国际贸易哪个网站比较好网页设计放大镜的实验报告
  • 本地的唐山网站建设wordpress增加logo
  • 深圳网站备案wordpress音乐网站
  • 做科技公司的网站公司诸暨城乡与建设局网站
  • 全网通官方网站小学校园文化设计公司
  • 赣州做网站的公司有哪家北京最近确诊病例轨迹
  • 湖南省住建厅官方网站建设干校电脑培训网上课程
  • 手机网站设计与实现毕业设计北京城建设计集团网站
  • 中小学网站建站模板网络规划设计师资格证
  • 网站建设素材网站建设开发计划模板
  • 为什么亿唐网不做网站做品牌湘潭交通网站
  • 淘宝客网站需要多大主机品牌策划方案书
  • 电子商务网站建设解决方案图形网站建设软件
  • 接单网站开发有网页源码 怎么做网站
  • 珠海 网站 设计莞城区仿做网站