java基础_泛型和反射机制

潜在类型机制

所谓泛型就是要编写能够尽可能广泛使用的代码。某些编程语言会提供 “潜在类型机制” 的方案,来使得编写的代码更加的广泛。

怎么来理解潜在类型机制了?它又被称为鸭子机制,即 “如果它走起来像鸭子,并且叫起来也像鸭子,那么你就可以把它当作鸭子来对待。”

首先来看看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编程思想(第四版)>>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值