泛型的3个格式

1.      List<String> res = new ArrayList<>(); 
2.      List<String> res = new ArrayList<String>();  

3.     List<> res = new ArrayList<String>(); 

(1) List<String>和 ArrayList<String>的 <String>作用一样吗?​

✅ ​​作用一样​​,都是 ​​指定集合存储 String类型​​。

  • List<String>(左侧)​​:声明变量 res是一个 ​List接口​​,并且 ​​只能存 String​。

  • ArrayList<String>(右侧)​​:实际创建的对象是 ArrayListList的实现类),并且 ​​只能存 String​。

  • new ArrayList<>()​ 的 <>里面可以不写 String,编译器会 ​​自动根据左侧的 List<String>推断​​ 成 ArrayList<String>

  • ​效果和 new ArrayList<String>()完全一样​​,但 ​​代码更简洁​​。

(2) 为什么右侧 <>可以不写 String?​

✅ ​​Java 7+ 支持 "钻石操作符" <>​(类型推断):

  • new ArrayList<>()​ 的 <>里面可以不写 String,编译器会 ​​自动根据左侧的 List<String>推断​​ 成 ArrayList<String>

  • ​效果和 new ArrayList<String>()完全一样​​,但 ​​代码更简洁​

但是3却不行​

​(1) 错误原因:左侧 List<>的泛型未指定​

  • List<>​ 中的 ​<>是空的​​,没有指定泛型类型(如 StringInteger)。

  • ​Java 要求泛型必须明确指定类型​​(比如 List<String>List<Integer>),​​不能省略​​(除非是 ​​右侧的 <>类型推断​​)。

​(2) 正确的语法规则​

  • ​左侧(声明变量)​​:List<类型>​必须明确指定泛型类型​​(如 List<String>)。

  • ​右侧(创建对象)​​:new ArrayList<>()​可以省略泛型类型​​(Java 7+ 支持类型推断)。

### Unity 对象池的实现格式与示例代码 在 Unity 中,对象池是一种常见的优化技术,用于减少频繁实例化和销毁对象带来的性能开销。通过使用 C# 的功能,可以创建一个通用的对象池类,适用于多种类的对象[^2]。 以下是实现对象池的完整示例代码: ```csharp using System.Collections.Generic; using UnityEngine; public class GenericObjectPool<T> where T : Component, new() { private Queue<T> _objectQueue; // 用于存储已实例化的对象 public GenericObjectPool(int initialSize) { _objectQueue = new Queue<T>(initialSize); PreallocateObjects(initialSize); // 预先分配对象 } /// <summary> /// 获取一个对象实例。如果池中没有可用对象,则创建新对象。 /// </summary> public T GetObject() { if (_objectQueue.Count > 0) { T obj = _objectQueue.Dequeue(); obj.gameObject.SetActive(true); // 激活对象 return obj; } else { return CreateNewObject(); // 如果池中无对象,则创建新对象 } } /// <summary> /// 将对象归还到池中。 /// </summary> public void ReturnObject(T obj) { obj.gameObject.SetActive(false); // 禁用对象 _objectQueue.Enqueue(obj); // 将对象放回队列 } /// <summary> /// 预先分配指定数量的对象。 /// </summary> private void PreallocateObjects(int count) { for (int i = 0; i < count; i++) { T obj = CreateNewObject(); obj.gameObject.SetActive(false); // 初始状态为禁用 _objectQueue.Enqueue(obj); } } /// <summary> /// 创建一个新的对象实例。 /// </summary> private T CreateNewObject() { GameObject prefab = Resources.Load<GameObject>("Prefabs/" + typeof(T).Name); if (prefab == null) { throw new System.Exception($"无法加载预制体: {typeof(T).Name}"); } GameObject instance = Instantiate(prefab); return instance.GetComponent<T>(); } } ``` #### 示例说明 1. **约束**:`where T : Component, new()` 表示类 `T` 必须继承自 `Component` 并且具有无参构造函数[^2]。 2. **对象获取与归还**:通过 `GetObject` 方法从池中获取对象,通过 `ReturnObject` 方法将对象归还到池中。 3. **预分配对象**:在初始化时调用 `PreallocateObjects` 方法预先创建一定数量的对象,避免运行时频繁实例化。 4. **资源加载**:`CreateNewObject` 方法通过 `Resources.Load` 加载预制体并实例化对象。 ### 注意事项 - 确保预制体路径正确,并且预制体名称与类 `T` 的名称一致。 - 如果需要支持非组件类(如普通类),可以移除 `Component` 约束,但需要调整对象激活/禁用逻辑[^4]。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值