很绕的标题,不过我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<T> where T : ...
2. **避免强制类型转换**:泛型类或泛型方法可以直接操作指定类型的对象,省去了手动转换的步骤。 3. **算法的复用**:泛型方法可以实现对不同数据类型的通用算法,无需重复编写相似的代码。 下面展示了两个编程...
这对于理解 Swift 中值类型和引用类型的区别非常重要。 4. protocol 的方法声明为 mutating:在 Swift 协议中,可以声明某些方法为 mutating,这样遵守协议的结构体或枚举实现该方法时,可以修改其状态。 5. ...
- **约束**:知道如何在泛型中指定类型参数的限制。 5. **集合** - **数组**:一维、二维数组的使用。 - **List**:了解List类作为动态数组的特点和常用方法。 - **Dictionary, TValue>**:掌握字典的使用,...
4. **泛型**:泛型允许我们在不指定具体类型的情况下编写可重用的代码。书中会讲解如何使用泛型来创建更通用的函数和类。 5. **模块与命名空间**:TypeScript引入了模块系统,以解决JavaScript中的全局变量污染问题...
当使用泛型时,可以通过添加约束来限制可以使用的类型。这些约束确保了类型安全性,并允许编译器做出更精确的推断。 #### 13. 类型别名 (Typealias) 类型别名用于为现有的类型提供新的名称。这有助于使代码更具...
这种限制称为单一继承(single inheritance)。如果使用extends关键字来定义一个子类,它只允许有一个父类。 - **解析**: 多重继承是指一个类可以从多个基类中继承属性和方法,而单一继承则指一个类只能从一个基类中...
在本中文版的Kotlin官方参考文档中,你将找到关于Kotlin的全面信息,包括基本语法、类和对象、函数、类型系统、泛型、集合操作、异常处理、协程以及与其他语言的互操作性等关键概念。 1. **基础语法**:Kotlin的...
通过类型参数,我们可以编写更加通用的代码,这些代码可以处理多种数据类型而不仅仅是单一类型。 - **借助参数宏摆脱类型限制**:早期的做法是使用宏来生成多个版本的函数或数据结构,但这种方式缺乏类型安全性。 -...
7. 泛型:泛型提供了一种方式,可以在不指定具体类型的情况下编写代码,提高代码的灵活性和效率。 8. 委托与事件:委托是C#中的类型,代表方法的引用,常用于实现事件处理。事件是对象间的通信机制,允许对象在其...
- 最小类型:用于类型推断,确保最小限制的类型匹配。 - 元组:可以组合不同类型的值,形成一个单一的复合值。 - 函数类型:定义函数的输入和输出类型。 6. **列表**: - Scala的List是不可变的,提供了丰富的...
由于泛型参数没有明确的类型限制,这可能导致在函数实现过程中需要频繁地使用`as`断言。 **示例:** ```typescript // 假设fns是一个函数索引表,TFns是其类型 function overloadFail(fn: T, params: Parameters[T]...
- **泛型**:提供了一种方式来创建类型参数化的类、接口和方法,提高了代码的复用性和类型安全性。 - **泛型类**:如`List<T>`,`Dictionary, TValue>`,其中`T`、`TKey`、`TValue`是类型参数。 - **泛型接口**:...
- **类型约束**:用于限制类型形参的类型范围,确保泛型代码的有效性。 - **类型形参差异**:通过协变和逆变支持泛型类型之间的转换。 #### 五、特性 特性是Visual Basic中的一种元数据标记,用于向类型添加额外的...
10. **泛型**:泛型允许创建类型安全的集合和方法,可以在运行时指定数据类型,提高了代码的灵活性和效率。 11. **异步编程**:C#引入了async/await关键词,使得编写异步代码变得更加简单,有助于改善应用程序的...
9. **泛型**:泛型允许在不指定特定类型的情况下定义类、接口和方法,提高代码的灵活性和复用性。例如,`List<T>`是常用的泛型集合。 10. **异步编程**:C#引入了`async`和`await`关键字,支持异步操作,使非阻塞I/...
2. 类型:数组只能存储单一类型,集合可以存储不同类型的元素(通过泛型限制)。 3. 方法:集合提供了更多高级操作,如添加、删除、查找等。 七、数组在实际应用中的例子 - 数据缓存:存储一定数量的最近访问数据。...
- 例如,可以通过将属性声明为`private`来限制对其的直接访问,而通过提供公共的读写方法来间接访问这些属性。 3. **继承**: - Delphi支持单一继承和多重继承。通过继承,子类可以继承父类的所有属性和方法。 -...