`
Kensai
  • 浏览: 15852 次
  • 性别: Icon_minigender_1
  • 来自: 成都
最近访客 更多访客>>
saw
文章分类
社区版块
存档分类
最新评论

关于泛型限制单一指定类型(具体类型)的方法的理解

阅读更多
  很绕的标题,不过我tm确实不知到咋表达合适。主要来讲就是原来看thinking in java的时候有一个一直没理解的地方。后来又忘问了,今天下午在看一篇文章时突然想起来。
  问题很简单类似
abstract class SomeType<E extends SomeType<E>> {
E f();
}

的签名,表示什么意思??
这种类型第一次出现在Thinking in java 4th,Generic那章。今天在找一个关于Enum的问题时又看到。

这种签名表示的确切意思有:
1.首先,E是SomeType的子类型
2.所有SomeType的子类型,都必须可以添加一个type parameter
3.前面两点说明,SomeType的子类型必须把自己作为type parameter.比如继承时
class MoreSpecificType extends SomeType<MoreSpecificType>{
MoreSpecificType f(){

.....

}
}

4.综合上面三点,对f()返回值的限制就是,必须是SomeType的当前子类型。比如
上面的例子。

作用:
这种写法的主要可以用来写出可以返回具体实现类类型的abstract factory.
也可以实现类似Generator模式(让编译时把泛型信息记录下来的一种模式,应该只有擦除式泛型的语言才有用)
如果有用过Enum,Enum源码中写法也类似:
public abstract class Enum<E extends Enum<E>>  implements Comparable<E>, Serializable {
....
}
分享到:
评论

相关推荐

    泛型集合泛型集合泛型集合

    泛型的概念源自英文"Generic",直译为“通用”,在C#中,它使得开发者能够在不指定具体类型的情况下编写类、接口、方法等,待实际使用时再指定具体的类型。这种设计大大增强了类型安全性,避免了不必要的类型转换和...

    泛型讲解网上泛型的列子不多

    为了限制类型参数的范围,可以通过添加约束来指定该类型参数必须满足的条件。例如,如果希望类型参数必须是某个接口或基类的派生类,则可以在类声明时加入相应的约束: ```csharp class Box&lt;T&gt; where T : ...

    2018-autumn-hw3-17020031057-石晓晨-201810212

    2. **避免强制类型转换**:泛型类或泛型方法可以直接操作指定类型的对象,省去了手动转换的步骤。 3. **算法的复用**:泛型方法可以实现对不同数据类型的通用算法,无需重复编写相似的代码。 下面展示了两个编程...

    Swifter-100个tips-2018年6月

    这对于理解 Swift 中值类型和引用类型的区别非常重要。 4. protocol 的方法声明为 mutating:在 Swift 协议中,可以声明某些方法为 mutating,这样遵守协议的结构体或枚举实现该方法时,可以修改其状态。 5. ...

    c#经典面试题及答案

    - **约束**:知道如何在泛型中指定类型参数的限制。 5. **集合** - **数组**:一维、二维数组的使用。 - **List**:了解List类作为动态数组的特点和常用方法。 - **Dictionary, TValue&gt;**:掌握字典的使用,...

    Learning TypeScript 中文版 [(西班牙)雷莫 H. 詹森(Remo H. Jansen )]

    4. **泛型**:泛型允许我们在不指定具体类型的情况下编写可重用的代码。书中会讲解如何使用泛型来创建更通用的函数和类。 5. **模块与命名空间**:TypeScript引入了模块系统,以解决JavaScript中的全局变量污染问题...

    Swifter - 100 个 Swift 必备 Tips

    当使用泛型时,可以通过添加约束来限制可以使用的类型。这些约束确保了类型安全性,并允许编译器做出更精确的推断。 #### 13. 类型别名 (Typealias) 类型别名用于为现有的类型提供新的名称。这有助于使代码更具...

    Java语言程序设计基础第十版第十一章课后复习题答案

    这种限制称为单一继承(single inheritance)。如果使用extends关键字来定义一个子类,它只允许有一个父类。 - **解析**: 多重继承是指一个类可以从多个基类中继承属性和方法,而单一继承则指一个类只能从一个基类中...

    Kotlin官方参考文档中文版最新版

    在本中文版的Kotlin官方参考文档中,你将找到关于Kotlin的全面信息,包括基本语法、类和对象、函数、类型系统、泛型、集合操作、异常处理、协程以及与其他语言的互操作性等关键概念。 1. **基础语法**:Kotlin的...

    C++ STL分析

    通过类型参数,我们可以编写更加通用的代码,这些代码可以处理多种数据类型而不仅仅是单一类型。 - **借助参数宏摆脱类型限制**:早期的做法是使用宏来生成多个版本的函数或数据结构,但这种方式缺乏类型安全性。 -...

    c#源代码

    7. 泛型:泛型提供了一种方式,可以在不指定具体类型的情况下编写代码,提高代码的灵活性和效率。 8. 委托与事件:委托是C#中的类型,代表方法的引用,常用于实现事件处理。事件是对象间的通信机制,允许对象在其...

    Scala by example

    - 最小类型:用于类型推断,确保最小限制的类型匹配。 - 元组:可以组合不同类型的值,形成一个单一的复合值。 - 函数类型:定义函数的输入和输出类型。 6. **列表**: - Scala的List是不可变的,提供了丰富的...

    【JavaScript源代码】一些在TypeScript上费过时间的地方总结.docx

    由于泛型参数没有明确的类型限制,这可能导致在函数实现过程中需要频繁地使用`as`断言。 **示例:** ```typescript // 假设fns是一个函数索引表,TFns是其类型 function overloadFail(fn: T, params: Parameters[T]...

    C#面向对象编程范例

    - **泛型**:提供了一种方式来创建类型参数化的类、接口和方法,提高了代码的复用性和类型安全性。 - **泛型类**:如`List&lt;T&gt;`,`Dictionary, TValue&gt;`,其中`T`、`TKey`、`TValue`是类型参数。 - **泛型接口**:...

    Visual Basic Language Specification11.0 语言规范

    - **类型约束**:用于限制类型形参的类型范围,确保泛型代码的有效性。 - **类型形参差异**:通过协变和逆变支持泛型类型之间的转换。 #### 五、特性 特性是Visual Basic中的一种元数据标记,用于向类型添加额外的...

    C#初學指引-繁體

    10. **泛型**:泛型允许创建类型安全的集合和方法,可以在运行时指定数据类型,提高了代码的灵活性和效率。 11. **异步编程**:C#引入了async/await关键词,使得编写异步代码变得更加简单,有助于改善应用程序的...

    ASP.NET经典教程7

    9. **泛型**:泛型允许在不指定特定类型的情况下定义类、接口和方法,提高代码的灵活性和复用性。例如,`List&lt;T&gt;`是常用的泛型集合。 10. **异步编程**:C#引入了`async`和`await`关键字,支持异步操作,使非阻塞I/...

    04_Java基础语法_(数组)_讲义

    2. 类型:数组只能存储单一类型,集合可以存储不同类型的元素(通过泛型限制)。 3. 方法:集合提供了更多高级操作,如添加、删除、查找等。 七、数组在实际应用中的例子 - 数据缓存:存储一定数量的最近访问数据。...

    Delphi面向对象编程思想

    - 例如,可以通过将属性声明为`private`来限制对其的直接访问,而通过提供公共的读写方法来间接访问这些属性。 3. **继承**: - Delphi支持单一继承和多重继承。通过继承,子类可以继承父类的所有属性和方法。 -...

Global site tag (gtag.js) - Google Analytics