`
pleasetojava
  • 浏览: 730432 次
  • 性别: Icon_minigender_2
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

MSDN-泛型中参数约束(where 关键字用法)

 
阅读更多

where 子句用于指定类型约束,这些约束可以作为泛型声明中定义的类型参数的变量。例如,可以声明一个泛型类 MyGenericClass,这样,类型参数 T 就可以实现 IComparable<T> 接口:

CopyCode image复制代码
public class MyGenericClass<T> where T:IComparable { }

除了接口约束,where 子句还可以包括基类约束,以指出某个类型必须将指定的类作为基类(或者就是该类本身),才能用作该泛型类型的类型参数。这样的约束一经使用,就必须出现在该类型参数的所有其他约束之前。

CopyCode image复制代码
// cs_where.cs
// compile with: /target:library
using System;

class MyClassy<T, U>
    where T : class
    where U : struct
{
}

where 子句还可以包括构造函数约束。可以使用 new 运算符创建类型参数的实例;但类型参数为此必须受构造函数约束 new() 的约束。new() 约束可以让编译器知道:提供的任何类型参数都必须具有可访问的无参数(或默认)构造函数。例如:

CopyCode image复制代码
// cs_where_2.cs
// compile with: /target:library
using System;
public class MyGenericClass <T> where T: IComparable, new()
{
    // The following line is not possible without new() constraint:
    T item = new T();
}

new() 约束出现在 where 子句的最后。

对于多个类型参数,每个类型参数都使用一个 where 子句,例如:

CopyCode image复制代码
// cs_where_3.cs
// compile with: /target:library
using System;
using System.Collections;

interface MyI
{
}

class Dictionary<TKey,TVal>
    where TKey: IComparable, IEnumerable
    where TVal: MyI
{
    public void Add(TKey key, TVal val)
    {
    }
}

还可以将约束附加到泛型方法的类型参数,例如:

CopyCode image复制代码
public bool MyMethod<T>(T t) where T : IMyInterface { }

请注意,对于委托和方法两者来说,描述类型参数约束的语法是一样的:

CopyCode image复制代码
delegate T MyDelegate<T>() where T : new()

有关泛型委托的信息,请参见泛型委托

有关约束的语法和用法的详细信息,请参见类型参数的约束

分享到:
评论

相关推荐

    Generic_2(泛型类-泛型方法-泛型接口-泛型限定(上限)

    这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。 Java语言引入泛型的好处是安全简单。 在Java SE 1.5之前,没有泛型的情况的下,通过对类型Object的引用来实现参数的“任意化”...

    JAVA-泛型课件-泛型课件

    泛型的类型参数可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口和泛型方法。 ### 泛型类 泛型类是指在定义类的时候引入类型参数。例如,标准库中的`ArrayList`就是一个泛型类,可以声明为`ArrayList&lt;T&gt;...

    C#学习之路--泛型

    在C#中,我们通过在类、接口、方法或委托声明中使用尖括号()来定义泛型。类型参数是泛型中的占位符,代表一个未指定的具体类型。例如,下面是一个简单的泛型方法定义: ```csharp public T Swap(T a, T b) { T ...

    实例190 - 泛型化的折半查找法

    泛型化是Java编程语言中的一个重要特性,它允许在类、接口和方法中使用类型参数,从而提高了代码的重用性和安全性。实例190 - 泛型化的折半查找法,就是关于如何利用泛型优化传统折半查找算法的一个实践示例。折半...

    Generic_3(泛型限定(下限)-泛型限定(上限的体现)-泛型限定(下限的体现)-泛型限定(通配符的体现)-集合查阅的技巧)

    这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。 Java语言引入泛型的好处是安全简单。 在Java SE 1.5之前,没有泛型的情况的下,通过对类型Object的引用来实现参数的“任意化”...

    8-java进阶-泛型1

    - 类中的成员变量和方法可以使用这些类型参数,例如`T age`。 3. **泛型方法**: - 泛型方法可以在任何类或接口中定义,它们不是类的一部分,而是独立的方法。方法签名前加上类型参数,如`public &lt;E&gt; List&lt;E&gt; ...

    29-API-集合框架-泛型-使用_java_

    - 泛型类:在类声明中使用类型参数,如`class MyList&lt;E&gt; { ... }`。 - 泛型接口:同样,接口也可以使用类型参数,如`interface MyCollection&lt;E&gt; { ... }`。 - 泛型方法:方法级别的泛型,如`public &lt;T&gt; T ...

    where泛型约束的使用

    通过使用`where`关键字,可以在泛型声明中对类型参数添加限制条件,从而更好地控制代码的行为。 #### 1. 基础概念 在C#中,`where`关键字用于指定泛型类型参数必须满足的条件。例如,在下面的代码示例中,我们定义...

    黑马程序员----泛型学习注意点

    可以使用`where`关键字对类型参数添加约束,例如`class Box&lt;T extends Comparable&lt;T&gt;&gt;`,这样`T`必须实现了`Comparable`接口,便于比较操作。 12. 泛型与反射: 在使用反射操作泛型类时,由于类型信息在运行时被...

    GP-泛型算法通则.rar_GP算法_gp_泛型

    GP算法是一种基于生物进化原理的计算方法,它模仿自然选择和遗传过程来解决复杂问题,而泛型编程是编程语言中的一种技术,允许创建可应用于多种数据类型的代码,提高代码的重用性和灵活性。本资源包主要围绕这两者的...

    Java-泛型.ppt

    **泛型**是一种参数化类型,它允许在类、接口和方法中使用类型参数,从而提高程序的重用性和类型安全性。泛型提供了一种在编译时检查类型安全性的机制,并且在运行时避免了不必要的类型转换。 #### 二、泛型类与...

    14-泛型.ts

    14-泛型

    java-泛型-面试题.docx

    java-泛型-面试题.docx

    java--泛型编程

    在泛型方法中,我们可以定义一个通用的方法,它能够在编译时根据传入的参数类型自动进行类型检查和转换。例如,`printArray` 方法就是一个泛型方法,它接受一个类型参数`E`的数组,并通过遍历数组打印出所有元素。在...

    java基础-泛型通配符

    java基础-泛型通配符

    C#源代码-泛型委托.zip

    在C#中,我们可以使用尖括号`&lt;&gt;`来声明和使用泛型,如`List&lt;T&gt;`,这里的`T`就是泛型类型参数,代表任何引用类型或值类型。 **委托**是C#中的一个引用类型,它类似于函数指针,但更安全且类型安全。委托可以指向具有...

    11.4java-泛型(Generic).md

    11.4java-泛型(Generic)

    JAVA设计模式--程序设计--反射--注解--泛型

    泛型是Java 5引入的新特性,它允许在类、接口和方法中使用类型参数,增强了类型安全性和代码重用。泛型可以避免类型转换的麻烦,防止在集合操作中插入不兼容的对象,同时在编译时就能捕获潜在的类型错误。例如,...

    黑马程序员----泛型与反射的小运用

    在Java编程语言中,泛型和反射是两个非常重要的特性,它们在软件开发中有着广泛的应用。本篇文章将深入探讨这两个概念以及它们在实际开发中的小运用。 首先,我们来看泛型(Generics)。泛型是在Java SE 5.0引入的...

    SSH笔记-泛型依赖注入

    泛型是Java SE 5引入的一种强大的类型系统机制,允许在类、接口和方法中使用类型参数,从而增强了代码的类型安全性和重用性。在Spring框架中,泛型主要应用于依赖注入(Dependency Injection,简称DI),这是Spring...

Global site tag (gtag.js) - Google Analytics