看到他我一下子就悟了-- 泛型(2)

   先说些题外话,只所以写这些东西。是看了优快云上的曹版主的一篇:手把手教编程,不知道有没有人愿意参与。说实话,我工作四年,总感觉晕晕乎乎的,好多技术都

懂,但是没有一项是精通的。看了这篇帖子,说实在话我可想去,去聆听大神的教导。主要是想提高自己,由于没有时间,又因为身在北京。所以就没有报名(呵呵,报名也

可能没有机会去)。所以自己就去图书馆去搞他提出的这些概念。其实我更希望在北京的大神们也能组织类似的活动。我想响应一定也很多,其实我想如果能组织一次这样的

活动,大神们也会得到提高的。这些都是我在图书馆看书的所得,分享给大家,同时也请管理员同志手下留情,不要每一篇都给打入冷宫,我已经很用心去做了。另外对这

感兴趣的童鞋们可以加我的QQ348537081,我们可以讨论一下心得。最后喜欢看书的童鞋也可以联系我,每周六首都图书馆,风雨无阻。

  说的有些多,下面转入正题。其实这篇文章是泛型介绍(接上一篇,具体的事例随后呈上)的扩展与修改。

因为家中无法联网,我都是提前用wps提前写好的,所有格式上可能会有一些问题,所以请大家多担待。

2.2接口约束(where T:interface-name)

  为了规定某个数据类型必须实现某个接口,需要声明一个接口约束(interface constraint).有了这种约束之后,甚至不需要执行类型转换,就可以调用一个显示的接口成员实现.接

口约束的主要功能与基类约束完全一样。首先,它允许开发人员在泛型类中使用接口的成员。其次,它确保只能使用实现了特定接口的类型实参。这意味着对于任何给定的接

口约束,类型实参要么是接口本身,要么实现了接口的类。

注:可以通过使用逗号分隔的列表来同时指定多个接口。如果某个约束同时包含基类和接口,则先指定基类再指定接口列表。


如:为了确保T类型参数都是先了IComparable接口,


public class Binary<T> where T:System.IComparable{...}


编译器会确保每次使用Binary类的时候,都必须指定一个实现了IComparable接口的类型参数.

 

  下面的程序通过改写前一个程序中的电话列表程序来说明接口约束的用途。在此程序中,PhoneNumber类被转换为一个名为IPhoneNumber的接口。然后,Friend和Supplier实现了该接口。

  

class NotFoundException1 : Exception
    {
        public NotFoundException1() : base() { }

        public NotFoundException1(string str) : base(str) { }

        public NotFoundException1(string str, Exception inner) : base(str, inner) { }

        protected NotFoundException1(System.Runtime.Serialization.SerializationInfo si,
            System.Runtime.Serialization.StreamingContext sc)
            : base(si, sc) { }
    }

    public interface IPhoneNumber
    {
        public string Number { get; set; }

        public string Name { get; set; }
    }

    public class Friend1 : IPhoneNumber
    {
        public string Number { get; set; }

        public string Name { get; set; }

        public bool IsWorkNumber { get; set; }

        public Friend1(string name, string num, bool wk)
        {
            Name = name;
            Number = num;
            IsWorkNumber = wk;
        }
    }

    public class Supplier1 : IPhoneNumber
    {
        public string Name { get; set; }

        public string Number { get; set; }

        public Supplier1(string name, string num)
        {
            this.Name = name;
            this.Number = num;
        }
    }

    class FriendEmail1 { }

    class PhoneList1<T> where T : IPhoneNumber
    {
        T[] phList;
        int end;

        public PhoneList1()
        {
            phList = new T[10];

            end = 0;
        }

        public bool Add(T newEntry)
        {
            if (end == 10) return false;

            phList[end] = newEntry;
            end++;

            return true;
        }

        public T FindByName(string name)
        {
            foreach (T item in phList)
            {
                if (item.Name == name)
                    return item;
            }

            throw new NotFoundException1();
        }

        public T FindByNum(string num)
        {
            foreach (T item in phList)
            {
                if (item.Number == num)
                    return item;
            }

            throw new NotFoundException1();
        }


 

 

 

2.3 struct/class 约束(where T:class/struct)

    另一个重要的泛型约束是将类型参数限制为一个值类型或者一个引用类型.编译器不允许在一个约束中将System.ValueType指定成基类.相反,C#提供了特殊的语法,这种语法同时适用于引用类型.在这种语法中,不是为T指定一个基类.相反,只需要指定关键字struct或者class.在同时存在其他约束时,class或者struct必须位于约束列表的开头

例:

Public struct Nullable<T>:IFormattable,IComparable,IComparable<Nullable<T>>,INullable where T:struct

{//.......}

2.4 new()构造函数约束

  New()构造函数约束允许开发人员实例化一个泛型类型的对象。一般情况下,无法创建一个泛型类型参数的实例。然而,new()约束改变了这种情况,它要求类型实参必须

提供一个无参数的构造函数。在使用new()约束的时候,可以通过调用该无参构造函数来创建对象。

class myclass

        {

            public myclass() { }

        }

        class Test<T> where T : new() 

        {

            T obj;

            public Test() 

            {

                obj = new T();

            }

        }

 

调用:

 Test<myclass> x = new Test<myclass>();

注意:myclass 不必显示地声明一个无参数构造函数,默认的构造函数也可以满足这种约束。然而,如果某个类除了无参的构造函数外还需要定义其他的构造函数,那么必须

为该类显式地声明不含参数的构造函数。

使用new()时,应注意三点:

一、它可以和其他约束一起使用,但必须位于约束列表的末端。

二、New()不允许给类型参数的构造函数传递实参

三、不可以同时使用new()约束和值类型约束

 

2.5多重约束

  同一个参数可以使用多个约束。这种情况下,需要使用一个逗号分隔的约束列表.在该列表中,第一个约束必须是class或者struct(如果存在的话),或者基类(如果被指

定)。指定class或者struct的同时也指定基类约束是非法的。接下来是接口约束。最后是new ()约束。如:

Class Gen<T> where T:myClass,IMyInterface,new(){}

如果有多个类型参数,那么每个类型名称的前面都要使用一个where关键字.如:

Class Gen<T,V> where T:class

Where T:struct

{//.....}

2.6.泛型方法


为了定义泛型方法,需要紧接在方法名之后添加类型参数语法,如


public T method<T>(T params)
{
return params;
}
泛型方法也允许指定约束:


public T method<T>(T params)
where T:IComparable
{
return params;
}

2.7.Default关键字:


  要确定用于创建泛型类实例的类型,需要了解一个最基本的情况:他们是引用类型还是值类型.若不知道这个情况,就不能用下面的代码赋予null值:

public class myGenericClass<T1,T2,T3>
{
    T1 t1;
    public myGenericClass()
{
    t1=null;
}
}


如果T1是值类型,则t1不能是null,所以这段代码将不会编译.幸好,我们可以用default关键字的新用法解决了它.
public myGenericClass()
{
  t1=default(T1);
}


其结果是:如果t1是引用类型,就给它赋予null,如果它是值类型,就赋予默认值.如数字类型,这个默认值就是0.

几个泛型类型的示例:


2.8定义泛型结构


public struct myStruct<T1,T2>
{
  public T1 item1;
  public T2 item2;

}


2.9定义泛型接口
  interface myInterfacee<T>{}


2.10 .定义泛型方法


 public T GetDefault<T>()
{

  return default(T);

}


2.11定义泛型委托


  public delegate T1 myDelegate<T1,T2>(T2 op1,T2 op2) where T1:T2

 

  结束语:泛型到这了,下一次介绍下反射,关于前几篇C#我会抽时间重新写的,能让他更详细点,其实这次C#基础知识的复习让我学到很多东西,以前模糊的概念,

现在变得非常清晰了。我曾经面试过好多人,有工作三年,有两年,甚至工作经验比我还长的。对这些基础性的知识都知之甚少,当然也包括我自己。因为如果没

有这些概念,工作中也不会可虑到这些东西,当然也就谈不上引用。所以我们都只能做底层程序。程序猿想提高,重新学这些基础知识吧,真的……

 

转载于:https://www.cnblogs.com/smiler/p/3168725.html

三、分区配置 rk3566/rk3568 修改分区 阅读详情

相关推荐

星网宇达Newton-M2设备安装及配置

主要介绍了星网宇达Newton-M2设备的配置过程

weixin_49353445的博客 2676

C#泛型入门泛型类、泛型集合、泛型方法、泛型约束、泛型委托

泛型集合和ArrayList的装箱拆箱、常见的泛型类型、泛型类和泛型方法、泛型约束、 泛型委托泛型很难理解?不然在接触的一个新的概念的时候,总会感觉难以理解,当你掌握并能熟练地使用的时候,发现这个概念其实简单的,我相信大多数码农都会有这种似曾相识的感觉。可能大多数人刚学习泛型的时候觉得很难理解,当然我也是这样的,所以便写下这篇文章加深一下对泛型的印象。

dotNet全栈开发 4万+

中兴U30air随身WiFi刷机全攻略:从ABD开启到系统调试(附工具包)

本文提供中兴U30air随身WiFi刷机全攻略,从ADB开启到系统调试的详细步骤,包括必备工具清单、ADB调试模式解锁、Bootloader解锁及自定义ROM刷入与调优。适合技术爱好者深度定制设备,提升网络性能和功能扩展。

weixin_29235923的博客 1931

一篇带你玩转泛型,泛型详解,什么是泛型,泛型缓存,协变与逆变,泛型方法,为什么使用泛型,泛型接口,ASP.Net泛型,泛型Generic

泛型是C#2.0推出的新语法,不是语法糖,而是2.0由框架升级提供的功能。我们在编写代码时,经常会遇到功能非常相似的模块,只是他们处理的数据不一样(参数类),有没有一种方法用同一个方法来处理传入不同类型的参数呢?泛型就可以解决这个问题。List 就是泛型,带有""括号的都是泛型,List是一个集合,也有可能是一组 泛型集合。泛型的用处是用一个东西来满足不同类型的需求。泛型命名空间。

Sx_Oracle的博客 2340

Understand-Anything:AI驱动的代码知识图谱,实现项目全局洞察与高效导航

在软件开发中,理解复杂代码库的结构和依赖关系是提升开发效率的关键。传统代码阅读方式往往陷入局部视角,难以快速把握系统全貌。知识图谱技术通过将代码实体(如文件、类、函数)及其关系(调用、继承、依赖)可视化,为代码理解提供了全局视角。这项技术的核心价值在于将静态代码转化为动态、可交互的认知地图,极大降低了系统学习与维护成本。在实际工程中,它广泛应用于新成员快速入职、遗留系统梳理、架构影响分析等场景。本文介绍的Understand-Anything工具,正是基于这一理念,通过多智能体分析管道,自动构建代码的结构图

weixin_42615290的博客 881

从零开始:Basler相机与pylon Viewer的工业视觉入门指南

本文详细介绍了Basler相机与pylon Viewer在工业视觉系统中的入门指南,涵盖硬件连接、软件安装、核心功能解析及实战案例。通过pylon Viewer的全面控制和参数调整功能,帮助新手快速掌握工业视觉检测技术,提升生产效率。

julia4scientist的博客 1134

Java泛型详解:Java泛型集合、泛型类、泛型方法、泛型的使用

在 Java 1.5 之前没有泛型,通常需要使用强制类型转换的方式将一种数据类型转换为另一种数据类型,这种转换要求开发者对实际参数的类型具有可预知性。对于强制类型转换错误的情况,编译器可能不会提示错误,但是在运行时会出现异常,这是一个安全隐患。 为了解决这一隐患,从 Java 1.5 开始提供了泛型。泛型可以在编译的时候检查类型安全,并且所有的强制转换都是自动和隐式的,提高了代码的重用率。本节将详...

jijiangpeng的博客 7433

2019年上交电院计算机直博保研经历

本人选报的是上交六月一日在武汉举办的直博选拔,五月三十一日到达酒店,地点在武汉大学旁边(PS:上交是不管住宿、来回车票的,~划重点~包括夏令营),入住后当然是紧张的准备英语面试等等内容了,当天我是排在了下午面试,感觉还很好,上午可以多睡一会,最好能够去踩踩点上午,然后下午面试一定要早去,说是一点开始,但是老师十二点半就开始让学生进去了,有一个同学排在第二个,但是当时叫到他时还不到一点,没到,最后据...

LifeMaker的博客 4891

c#泛型使用详解:泛型特点、泛型继承、泛型接口、泛型委托

泛型:通过参数化类型来实现在同一份代码上操作多种数据类型。利用“参数化类型”将类型抽象化,从而实现灵活的复用。在.NET类库中处处都可以看到泛型的身影,尤其是数组和集合中,泛型的存在也大大提高了程序员的开发效率。更重要的是,C#的泛型比C++的模板使用更加安全,并且通过避免装箱和拆箱操作来达到性能提升的目的。因此,我们很有必要掌握并善用这个强大的语言特性。 C#泛型特点: 1、如果实例

zdhlwt2008的博客 1万+

推荐系统(1):推荐系统评测

对于可以离线优化的指标,我个人的看法是应该在给定覆盖率、多样性、新颖性等限制条件下,尽量优化预测准确度。用一个数学公式表达,离线实验的优化目标是:最大化预测准确度使得 覆盖率 > A多样性 > B新颖性 > C其中,A、B、C的取值应该视不同的应用而定。

数据不会骗人 2526

华为OD机试 - 去除多余空格(Python/JS/C/C++ 2024 E卷 100分)

本专栏收录于《华为OD机试真题(Python/JS/C/C++)》。刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新。去除文本多余空格,但不去除配对单引号之间的多余空格。给出关键词的起始和结束下标,去除多余空格后刷新关键词的起始和结束下标。条件约束:输入为两行字符串:第一行:待去除多余空格的文本,用例保证如果有单引号,则单引号成对出现,且单引号可能有多对。 第二

学Java,找哪吒 1215

c#: 泛型接口、泛型方法

泛型可以自定义泛型接口、泛型类、泛型方法、泛型事件、泛型委托。 1>自定义泛型接口 和普通接口一样,一个泛型接口通常也是与某些对象相关的约定规程。泛型接口的声明如下: interface  [接口名] { [接口体] } 在c#中,通过尖括号“。一般来说,声明泛型接口与声明非泛型接口遵循相同的规则。 泛型接口定义完成之后,就要定义此接口的子类。定义泛型接口的子类有以下两种方法。

匆匆那年 1万+

手把手教你学simulink(13.2)--构建一个单相并网逆变器Simulink仿真模型

基于Simulink的单相并网逆变器项目的详细仿真实例。这个项目将重点放在逆变器的详细建模、最大功率点跟踪(MPPT)控制策略、并网控制和仿真分析上。我们将使用MATLAB/Simulink来构建整个系统,并通过具体的代码和模块来实现各个功能。

MHD0815的博客 545

泛型——(2)泛型类、泛型方法、泛型接口

一、泛型类 定义Person类 package cn.itcast.p2.bean; public class Person implements Comparable&lt;Person&gt; { private String name; private int age; public Person() { super(); } public P...

真香号 2万+

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Java泛型详解:为什么使用泛型?如何使用泛型?

大家好!,今天我将为大家介绍一个非常有趣的话题——泛型。作为Java语言中的一项重要特性,泛型可以让我们编写更加通用和灵活的代码。无论您是刚入门Java编程,还是已经有一定经验的开发者,了解泛型都对您的编程能力有所帮助。本文将深入探讨泛型的实现原理和本质,帮助您更好地理解并应用泛型。现在就让我们一起来探索吧!

沉淀所学,分享所思,让热爱与成长同行。商务记录AI实战经验,助力开发者快速成长。 热爱AI,希望做出有影响力的技术成果。 技术点亮生活,分享连接价值与机会。 专注AI落地实战,陪你走好技术每一步。 8380

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Java泛型(泛型类、泛型方法、泛型接口)

目录标题泛型引入1. 泛型类特点2. 最简单泛型类3. 泛型方法4. 泛型接口5. 泛型类可是同时设置多个类型参数6. 泛型的类型参数可以是泛型类7. 泛型类可以继承泛型类8. 泛型类可以实现泛型接口 泛型引入 如果我们需要产生多个对象,每个对象的逻辑完全一样,只是对象内的成员变量的类型不同,那我们如何去做? 此时,我们就引入了泛型。 泛型:让数据类型变得参数化。定义泛型时,对应的数据类型是不确定的。泛型方法被调用时,才指定具体类型 这样就解决了多个相似的类(方法、接口 )创建的问题,一个泛型类即可代替所

one goto one 的博客 4454

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

C#入门级——泛型、泛型类、泛型接口、泛型方法和泛型委托

C#入门级——泛型、泛型类、泛型接口、泛型方法和泛型委托

dlwlrma_516的博客 5042

Java之泛型,什么是泛型?为什么用泛型?(泛型详解)

1.为什么会有泛型呢? 早期的Object类型可以接受任意的对象类型,但是在实际使用中,会有类型转化的问题,存在隐患,所以Java提供泛型解决这个安全问题 2.什么是泛型? 泛型,即“参数化类型”。一提到参数,最熟悉的就是定义方法时有形参,然后调用此方法时传递实参。那么参数化类型怎么理解呢?顾名思义,就是将类型由原来的具体的类型参数化,类似于方法中的变量参数,此时类型也定义成参数形式(可以称之为类...

围巢 3969

看到他我一下子就悟了-- 泛型(1)

1.泛型概念: 本质上,术语”泛型”指的是”参数化类型(parameterizedtypes)”.参数化类型非常重要,因为它们可以在创建类.结构.方法和委托的时候将要操作的数据类型作为参 数进行指定.使用参数化类型的类.结构.方法和委托都可以称为泛型,如”泛型类”或者”泛型方法”. 在具体声明一个变量或者实例化之前,类型参数T只是一个占位符。等到具体声明...

dddp75921的博客 139

Java泛型——为何要有泛型

对于String类类型来说,它是继承自Object的,而Integer的直接父类是Number,因此会有Integer无法转String的错误。泛型类是在实例化类的时候指明泛型的具体类型,那么泛型方法就是在调用方法时指明泛型的具体类型。在实现传入泛型实参的泛型接口的实现类定义中,实现类即使不声明泛型,也不会编译错误。在实现未传入泛型实参的泛型接口的实现类定义中,实现类要声明泛型,否则会编译错误。为了避免这样可能的错误,引入泛型,使编译器在编译阶段就提示不匹配的类类型。方法返回了一个更加特定的返回类型。

xiaovie的博客 1719

Java泛型——类泛型、接口泛型、方法泛型的实现及泛型限定与类型变化关系

自定义泛型类、泛型方法、泛型接口 对泛型的限定、以及数据类型的变化:协变、逆变、双变、不变

任天柳 5200

java泛型——泛型类、泛型方法、泛型接口

泛型Java 泛型Java 泛型是什么泛型类泛型类的格式泛型类举例泛型方法泛型方法的格式泛型方法举例泛型接口泛型接口的格式泛型接口举例 Java 泛型 Java 泛型是什么 官方定义: 泛型是Java SE 1.5的新特性,泛型的本质就是参数化类型,也就是说所操作的数据类型被指定为一个参数 这种参数类型可以用在类、接口和方法的创建中,分别成为泛型类、泛型接口、泛型方法 优缺点: ​ 优点:可以不用再类型转换了 ​ 缺点:降低了代码的可读性 泛型类 泛型类:当一个类要操作的引用数据类型不确定的时候,可

一个小小的码农 6583

C#泛型与泛型约束

为什么要使用泛型 考虑一种堆栈类 class Stack { public string[] Elements { get; set; } public int Current { get; set; } public string Pop() { return Elements[Current]; ...

Codeeror的博客 4077

泛型

package com.xatu.集合; import java.util.HashSet; import java.util.Iterator; import java.util.Set; import org.junit.Test; public class GenericTest { @Test public void testGenneric() { Set&lt;Str...

大哥的叔的博客 1万+

Java泛型的深入理解以及上下限泛型和泛型通配符

详细介绍了Java中的泛型的概念、原理和使用,比如上、下限泛型、泛型通配符等。

终生学习践行者 2661

泛型<>

1. 泛型介绍 Java泛型是JDK1.5中引入的一个新特性,其本质是参数化类型,也就是说所操作的 数据类型被指定为一个参数(type parameter)这种参数类型可以用在类、接口和 方法的创建中,分别称为泛型类、泛型接口、泛型方法。 场景:一个魔法口袋,每一个口袋实例可以存储任意一种指定引用类型的数据,存 储的数据类型是不确定,将类型作为参数 2. 泛型类和泛型接口 如果定义的一个类或接口有一个或多个类型变量,则可以使用泛型。泛型类型变量由尖括号界定,放在类或者接口名的后面 下面定义尖括号中的T称为类

Hello_zbs的博客 3833
上一篇: ExtJS4中设置tabpanel的tab高度问题
下一篇: 混合模式程序集是针对“v2.0.50727”版的运行时生成的,在没有配置其他信息的情况下,无法在 4.0 运行时中加载该......
dddp75921
博客等级 码龄12年 9粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值