潜在类型机制
所谓泛型就是要编写能够尽可能广泛使用的代码。某些编程语言会提供 “潜在类型机制” 的方案,来使得编写的代码更加的广泛。
怎么来理解潜在类型机制了?它又被称为鸭子机制,即 “如果它走起来像鸭子,并且叫起来也像鸭子,那么你就可以把它当作鸭子来对待。”
首先来看看python的潜在类型机制:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
class Dog:
def speak(self):
print "Arf!"
def sit(self):
print "Sitting!"
class Robot:
def speak(self):
print "Click!"
def sit(self):
print "Clank!"
def perform(anything):
anything.speak()
anything.sit()
a = Dog()
b = Robot()
perform(a)
perform(b)
如上面这样的书写是不是相当的宽泛,perform 并不关心anything是什么东西。它只需要知道anything 有 speak 和 sit两个方法就行。
因为泛型是在JAVA1.5之后才加入到Java语言特性中的,所以JAVA没有任何机会可以去实现任何类型的”潜在类型机制“。
潜在类型机制的补偿(反射)
尽管JAVA不支持潜在类型机制,但是JAVA提供了针对缺失潜在类型机制的一种补偿机制,即反射。
package com.java.basic.generic;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
/**
*
* 反射
* */
public class GenericDemo020 {
public static void main(String[] args) {
perform(new Dog());
perform(new Robot());
}
public static void perform(Object speaker){
Class<?> spkr = speaker.getClass();
try {
Method speak = spkr.getMethod("speak");
speak.invoke(speaker);
} catch (NoSuchMethodException e) {
e.printStackTrace();
}catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
}
class Dog{
public void speak(){
System.out.println("Arf");
}
public void sit(){
System.out.println("Sitting");
}
}
class Robot{
public void speak(){
System.out.println("Click");
}
public void sit(){
System.out.println("Clank");
}
}
反射作为对潜在类型机制的一种补偿,提供了更加多的可能性。但是它将所有的类型检查都移到了运行时,这丧失了静态类型检查(编译期检查)的优势,所以我们在使用反射机制的时候必须谨慎小心。因为反射机制的很多动作都是在运行时发生的,所以它会比非反射要慢一些;但是这不应该阻止你使用这种解决方案,至少可以将其作为一种马上就能想到的解决方案。
参考
<<java编程思想(第四版)>>