- 在学习 Python 3.10 新特性时,其中有个类型别名(TypeAlias), 所举的例子是
1StrCache = 'Cache[str]' # a type alias<br /> 2LOG_PREFIX = 'LOG[DEBUG]' # a module constant
可写成1StrCache: TypeAlias = 'Cache[str]' # a type alias<br /> 2LOG_PREFIX = 'LOG[DEBUG]' # a module constant
这让 StrCache 更像是一个类型别名,而不是一个看起来明显就是Cache[str]的字符串变量(实际上它确实是)。
本文不在 TypeAlias 本身,而是从Cache[str]能看出 Python 似乎也能支持像 Java 那样的泛型, 就像 Python 内置支持的 List[str] 或 list[str] 那样。
那么来看 Python 怎么去实现一个只能放入字符串的Cache[str]Cache, 而不能放入别的类型。 Read More - 在 Java 中对于下面最简单的泛型类
class A<T> {
设想我们使用时
public void foo() {
//如何在此处获得运行时 T 的具体类型呢?
}
}new A<String>().foo();
是否能在foo()方法中获得当前的类型是 String 呢?答案是否定的,不能。在foo()方法中 this 引用给不出类型信息,this.getClass()就更不可能了,因为 Java 的泛型不等同于 C++ 的模板类,this.getClass()实例例是被所有的不同具体类型的 A 实例(new A<String>(), new A<Integer>() 等) 共享的,所以在字节码中类型会被擦除到上限。
我们可以在 IDE 的调试时看到这个泛型类的签名
Read More - 前面介绍的无论是泛型类还是泛型方法,基本上都是把定义的类型参数作为一个整体来操作,放到数组或取出来,顶多就是调用了一下 hashCode() 方法,因为这是 Java 的根对象拥有的方法。比如说一个泛型数组,要得到其中的最小元素:
1package com.unmi; 2 3/** 4 * 泛型,类型变量的限定 5 * @author Unmi 6 */ 7public class ArrayAlg { 8 9 public static <T> T main(T[] a){ 10 if(a==null || a.length ==0){ 11 return null; 12 } 13 T smallest = a[0]; 14 for(int i=0;i<a.length;i++){ 15 if(smallest.compareTo(a[i])>0){ 16 smallest = a[i]; 17 } 18 } 19 20 return smallest; 21 } 22}
Read More - 前面讲了泛型类的定义,你也可以在一个普通类中单单定义一个泛型方法。也就是说类能够带个类型参数,方法也可以带类型参数的。还是来看个例子(包括如何应用),一个获得数组中间元素的方法,因为数组中存储元素的类型是不定的,所以把该方法定义成泛型的。
1package com.unmi; 2 3/** 4 * 泛型方法示例 5 * @author Unmi 6 */ 7public class ArrayAlg { 8 9 //这个就是在普通类 ArrayAlg 中定义的泛型方法 10 public static <T> T getMiddle(T[] a){ 11 return a[a.length/2]; 12 } 13 14 public static void main(String[] args) { 15 String[] names = {"Fantasia","Unmi","Kypfos"}; 16 //String middle = ArrayAlg.<String>getMiddle(names); 17 18 //上面那样写是可以,编译器可推断出要调用的方法,所以省去<String> 19 String middle = ArrayAlg.getMiddle(names); 20 System.out.println(middle); 21 } 22}
Read More - JDK 1.5 相对于 JDK 1.4 来说变化最大的部分就是泛型,甚至可以说自 Java 1.0 发布以来也是最大的一次语言变化,因为要涉及到编译器的大改动。很早的时候大家对泛型的呼声很大,正如 C++ 的模板,C# 的泛型确实是个值得借鉴的好特性。JDK1.5 这前,很多人对于泛型是急不可耐,在 JDK1.4 下搭配一个外挂的 Generic Java 编译器,通老实 -Xbootclasspath、-bootclasspath 同样能让你在 1.4 的 JDK 上使用泛型:
javac -J-Xbootclasspath/p:JSR14HOME\gjcrt.jar -bootclasspath JSR14HOME\collect.jar;JDK141HOME\jre\lib\rt.jar -source 1.5 FileName.java
java -Xbootclasspath/p:JSR14HOME\gjc-rt.jar FileName Read More