Thinking In Java Part11(泛型数组、通过extends限制边界)

本文深入探讨了Java泛型中的泛型数组和边界的概念,解释了为何在泛型类中使用Object[]而非T[],以及如何通过类型标记解决泛型数组的问题。此外,还详细讲解了如何使用边界限制泛型参数,使其能够调用特定类型的方法,以及在继承层次结构中如何添加和使用边界限制。
1、泛型数组
	因为有了擦除,数组运行时的类型只能是Object[],如果我们立即将其转型为T[],那么在编译器该数组的实际类型就将丢失,而编译器可能会错过某些潜在的错误检查,因此,最好在集合内部使用Object[],然后当使用数组元素时,添加一个对T的转型。
	public class GenericArray2<T> {
	    private Object[] array;

	    public GenericArray2(int sz) {
	        this.array = (T[]) new Object[sz];
	    }

	    public void put(int index, T item) {
	        array[index] = item;
	    }

	    public T get(int index) {
	        return (T) array[index];
	    }

	    public T[] rep() {
	        return (T[]) array;
	    }

	    public static void main(String[] args) {
	        GenericArray2<Integer> integerGenericArray = new GenericArray2<>(10);
	        for (int i = 0; i < 10; i++) {
	            integerGenericArray.put(i, i);
	        }
	        for (int i = 0; i < 10; i++) {
	            System.out.println(integerGenericArray.get(i) + "");
	        }
	        System.out.println();
	        try{
	            Integer[] rep = integerGenericArray.rep();
	        }catch (Exception e){
	            System.out.println(e);
	        }
	    }
	}	
	现在内部是Object[]而不是T[],当get被调用时,他将对象转型为T,实际上是正确的类型,因此是安全的。然而,在调用rep的时候,将Object[]转型为T[],仍旧是不正确的。没有任何方式可以推翻底层的数组类型,只能是Object[]。在内部将array当作Object[]而不是T[]处理的优势是:我们不太可能忘记这个数组的运行时类型学想,从而以外地引入缺陷(尽管大多数也可能是所有这类缺陷都可以在运行时快速探测到)
	通过传递类型标记完成泛型数组:
	public class GenericArrayWithTypeToken<T> {
	    private T[] array;

	    public GenericArrayWithTypeToken(Class<T> type,int sz) {
	        this.array = (T[]) Array.newInstance(type,sz);
	    }

	    public void put(int index, T item) {
	        array[index] = item;
	    }

	    public T get(int index) {
	        return (T) array[index];
	    }

	    public T[] rep() {
	        return array;
	    }

	    public static void main(String[] args) {
	        GenericArrayWithTypeToken<Integer> integerGenericArrayWithTypeToken = new GenericArrayWithTypeToken<>(Integer.class, 10);
	        Integer[] rep = integerGenericArrayWithTypeToken.rep();
	    }
	}
	类型标记Class<T>被传递到构造器中,以便从擦除中恢复,使得我们可以创建需要的实际类型的数组。可以将运行时类型转为确切类型T[]
2、边界
	边界可以在用于泛型的参数类型上设置限制条件。也可以强制规定泛型可以应用的类型,但是其潜在的一个更重要的效果是可以按照自己的边界类型来调用方法。
	因为擦除移除了类型信息,所以无界泛型参数调用的方法只是那些可以用Object调用的方法。为了将这个参数限制为某个类型的子集,然后用这些类型子集调用方法,泛型重用了extends关键字。
	interface HasColor{java.awt.Color getColor();}
	class Colored<T extends HasColor>{
	    T item;

	    public Colored(T item) {
	        this.item = item;
	    }

	    public T getItem() {
	        return item;
	    }
	    java.awt.Color color(){return item.getColor();}
	}
	class Dimension {public int x,y,z;}
	// class 需要放在第一个
	//class ColoredDimension<T extends HasColor&Dimension>
	class ColoredDimension<T extends Dimension&HasColor>{
	    T item;

	    public ColoredDimension(T item) {
	        this.item = item;
	    }

	    public T getItem() {
	        return item;
	    }
	    java.awt.Color color(){return item.getColor();}
	    int getX(){return item.x;}
	    int getY(){return item.y;}
	    int getZ(){return item.z;}
	}
	interface Weight{int weight();}
	class Solid<T extends Dimension &HasColor&Weight>{
	    T item;

	    public Solid(T item) {
	        this.item = item;
	    }

	    public T getItem() {
	        return item;
	    }
	    java.awt.Color color(){return item.getColor();}
	    int getX(){return item.x;}
	    int getY(){return item.y;}
	    int getZ(){return item.z;}
	    int weight(){return item.weight();}
	}
	class Bounded extends Dimension implements HasColor,Weight{

	    @Override
	    public Color getColor() {
	        return null;
	    }

	    @Override
	    public int weight() {
	        return 0;
	    }
	}
	public class BasicBounds {
	    public static void main(String[] args) {
	        Solid<Bounded> boundedSolid = new Solid<>(new Bounded());
	        boundedSolid.color();
	        boundedSolid.weight();
	        boundedSolid.getY();
	    }
	}
	看上去可以通过继承消除包含冗余,下面看如何在继承的每个层次上添加边界限制。
	class HoldItem<T> {
	    T item;

	    public HoldItem(T item) {
	        this.item = item;
	    }

	    public T getItem() {
	        return item;
	    }
	}

	class Colored2<T extends HasColor> extends HoldItem<T> {

	    public Colored2(T item) {
	        super(item);
	    }

	    java.awt.Color color() {
	        return item.getColor();
	    }
	}

	class ColoredDimension2<T extends Dimension & HasColor> extends Colored2<T> {

	    public ColoredDimension2(T item) {
	        super(item);
	    }

	    int getX() {
	        return item.x;
	    }

	    int getY() {
	        return item.y;
	    }

	    int getZ() {
	        return item.z;
	    }

	}

	class Solid2<T extends Dimension & HasColor & Weight> extends ColoredDimension2<T> {
	    public Solid2(T item) {
	        super(item);
	    }

	    int weight() {
	        return item.weight();
	    }
	}

	public class InheritBounds {
	    public static void main(String[] args) {

	        Solid2<Bounded> boundedSolid2 = new Solid2<>(new Bounded());
	        boundedSolid2.color();
	        boundedSolid2.getY();
	        boundedSolid2.weight();
	    }

	}
	HoldItem直接持有一个都系,因此这种行为被继承到Colored2中,它要求参数和HasColor一致。ColoredDimension2和Solid2进一步扩展了这个层级结构,并在每个层次上添加了边界。现在这些方法被继承,因而不必在每个类中重复
	interface SuperPower {
	}

	interface XRayVision extends SuperPower {
	    void seeThroughWalls();
	}

	interface SuperHearing extends SuperPower {
	    void hearSubtleNoises();
	}

	interface SuperSmell extends SuperPower {
	    void trackBySmell();
	}

	class SuperHero<POWER extends SuperPower> {
	    POWER power;

	    public SuperHero(POWER power) {
	        this.power = power;
	    }

	    public POWER getPower() {
	        return power;
	    }
	}

	class SuperSleuth<POWER extends XRayVision> extends SuperHero<POWER> {

	    public SuperSleuth(POWER power) {
	        super(power);
	    }

	    void see() {
	        power.seeThroughWalls();
	    }
	}

	class CanineHero<POWER extends SuperHearing & SuperSmell> extends SuperHero<POWER> {

	    public CanineHero(POWER power) {
	        super(power);
	    }

	    void hear() {
	        power.hearSubtleNoises();
	    }

	    void smell() {
	        power.trackBySmell();
	    }

	}

	class SuperHearSmell implements SuperHearing, SuperSmell {

	    @Override
	    public void hearSubtleNoises() {

	    }

	    @Override
	    public void trackBySmell() {

	    }
	}

	class DogBoy extends CanineHero<SuperHearSmell> {

	    public DogBoy() {
	        super(new SuperHearSmell());
	    }
	}

	public class EpicBattle {
	    static <POWER extends SuperHearing> void useSuperHearing(SuperHero<POWER> hero) {
	        hero.getPower().hearSubtleNoises();
	    }

	    static <POWER extends SuperHearing & SuperSmell> void useFind(SuperHero<POWER> hero) {
	        hero.getPower().hearSubtleNoises();
	        hero.getPower().trackBySmell();
	    }

	    public static void main(String[] args) {
	        DogBoy dogBoy = new DogBoy();
	        useSuperHearing(dogBoy);
	        useFind(dogBoy);
	        // ?被限制为单一边界 因此报错
	//        List<? extends SuperHearing&SuperSmell > dogBoys;
	    }
	}
	通配符?被限制为单一边界

内容概要:本文介绍了一种用于电磁暂态(EMT)研究的第四类全变流器风力发电系统的通用Simulink仿真模,旨在构建一个能够准确反映实际风电系统动态特性的简化通用模。该模涵盖了风力机、传动链、发电机、全功率变流器及其控制策略等关键组成部分,重点突出系统在电网故障、风速波动等复杂工况下的动态响应能力,适用于风电并网电磁暂态分析、新电力系统稳定性评估及高比例可再生能源接入场景的研究。模设计兼顾准确性与仿真效率,便于研究人员快速搭建和调试,推动风电系统建模与控制技术的发展; 适合人群:具备一定电力系统理论基础和MATLAB/Simulink仿真能力,从事新能源发电、电力电子变换、风电并网控制及相关方向的研究生、科研人员及工程技术人员; 使用场景及目标:①开展风电系统在电网扰动下的电磁暂态仿真分析;②研究全功率变流器风电机组的动态行为与控制特性;③支撑新电力系统中高渗透率风电接入的稳定性与电能质量评估,服务于学术研究、课程教学与工程项目前期仿真验证; 阅读建议:建议读者结合文中提供的模结构与参数设置,在Simulink环境中动手复现并调试仿真模,通过设置不同运行工况(如三相短路、低电压穿越、风速突变等)观察系统响应,深入理解全变流器风电机组的建模方法、控制逻辑与动态特性,进而拓展应用于更复杂的多机并网或综合能源系统仿真场景。
内容概要:本文探讨了Hash算法在芯片行业,特别是网络处理器(NPU)中的性能优化实践,聚焦于如何通过硬件流水线设计实现纳秒级高速哈希查找。文章分析了传统软件哈希方案在高带宽场景下的局限性,提出基于硬件描述语言或高层次综合(HLS)的设计方法,采用CRC32等硬件友好哈希函数、并行多路哈希、流水线化解耦以及双端口存储结构等核心技术,实现低延迟、无阻塞的数据包处理。通过C++风格的HLS代码示例,展示了从算法选择到资源优化的完整硬件加速逻辑,并深入剖析了循环展开、位宽控制、内存映射和流水线调度等关键实现细节。最后展望了可编程交换机、P4语言支持及TCAM与哈希混合架构等未来发展方向。; 适合人群:具备数字电路基础、熟悉Verilog/SystemVerilog或HLS的芯片设计工程师,以及从事网络芯片、FPGA加速、高性能路由设备研发的技术人员(工作年限1-5年为宜);也适合对硬件加速算法感兴趣的研究人员。; 使用场景及目标:①掌握如何将哈希算法高效映射到硬件逻辑中以满足线速转发需求;②理解流水线设计、资源约束优化、读写冲突规避等在实际芯片项目中的应用;③为开发高性能网络处理器中的流表/路由表查找单元提供技术参考与实现范例。; 阅读建议:学习时应结合HLS工具(如Xilinx Vitis HLS)进行代码仿真与综合,重点关注#pragma指令对硬件结构的影响,并对比不同哈希算法在资源占用与时序表现上的差异,深入理解“空间换时间”的硬件优化本质。
内容概要:本文系统研究了基于粒子群优化(PSO)、灰狼优化(GWO)、鲸鱼优化(WOA)、哈里斯鹰优化(HHO)、蜣螂优化(DBO)和麻雀搜索算法(SSA)六种智能优化算法在无人机三维路径规划中的应用,并在Matlab平台上实现了相应的仿真代码。研究构建了复杂的三维地形与障碍物环境模,设计了包含路径长度、飞行时间、能耗及安全性等多维度的成本函数,通过定义合理的适应度函数与飞行约束条件,对各类算法的路径搜索能力、收敛速度与规划质量进行了全面对比分析。通过仿真实验验证了各算法在静态复杂环境下的性能表现,旨在为实际无人机任务中优化算法的选择提供科学依据和技术支持。; 适合人群:具备一定Matlab编程基础,从事智能优化算法、无人机路径规划、自动化控制及相关领域研究的研究生、科研人员或工程技术人员。; 使用场景及目标:① 掌握主流群智能优化算法在无人机三维路径规划中的建模与实现方法;② 对比分析不同算法在相同复杂环境下的性能差异,为算法选提供量化依据;③ 为后续研究动态环境路径规划、多无人机协同任务分配等问题奠定理论与技术基础; 阅读建议:建议读者结合提供的Matlab代码逐模块分析算法实现流程,重点关注适应度函数的设计、障碍物规避策略的实现以及多目标成本函数的权衡机制,同时可通过调整参数设置或引入新优化算法进行扩展实验,以深化对算法性能的理解与实际应用能力。
内容概要:本文研究了复杂威胁环境下基于多段杜宾斯(Dubins)路径的多无人机协同路径规划问题,提出了一种结合无人机运动学约束与优化算法的协同规划方法。通过Matlab平台实现了路径规划算法的建模与仿真,构建了包含障碍物、禁飞区及动态威胁因素的复杂环境模,采用优化策略对多无人机系统的飞行路径进行全局协同优化,确保各无人机在满足Dubins路径连续性和曲率约束的前提下,实现任务最优或近优完成。该方法有效解决了多机路径间的冲突规避问题,提升了路径的安全性、可行性和整体效率,具有较强的工程应用价值。; 适合人群:具备一定编程基础和自动化、航空航天、智能无人系统等相关学科背景的科研人员及研究生,尤其适合从事路径规划、多智能体协同控制、智能优化算法研究的专业人士。; 使用场景及目标:①应用于军事侦察、灾害救援、边境巡检、区域监控等多无人机协同作业的实际任务场景;②为复杂环境下多智能体系统的避障、协同决策与路径优化提供算法支持与技术参考;③辅助研究人员复现算法模,开展进一步的创新性研究与性能对比分析。; 阅读建议:此资源以Matlab代码实现为核心,强调理论与仿真实践相结合,建议读者在掌握Dubins路径基本原理的基础上,结合所提供的代码进行参数调试与仿真实验,深入理解协同优化机制与算法收敛特性,从而提升对多无人机系统路径规划问题的整体认知与研究能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值