java泛型解析02

/**
 * @(#)Generics.java
 *
 *
 * @author
 * @version 1.00 2008/9/27
 */
class Book{
 static int id;
 Book(){System.out.println("Book "+id++);}
 public void pagedown(){System.out.println("pagedown!");}
 }
class EnglishBook extends Book{}
class ChineseBook extends Book{}
class ChineseHistory extends ChineseBook{}


class Generics2<T>{
 private T a;
    public Generics2(T a) {
     this.a=a;
    }
    public void set(T a){this.a=a;}
    public T get(){return a;}
 }

class Generics<T> {
 private T a;
    public Generics(T a) {
     this.a=a;
    }
    public void test(T a){a.pagedown();}
    public void set(T a){this.a=a;}
    public T get(){return a;}   
}

public class Test{
 public static void main (String[] args) {
  EnglishBook e=new EnglishBook();
  Generics<EnglishBook> g=new Generics<EnglishBook>(e);
  g.test(e);
}
 }

 

注意看,class Generics<T>的定义中有一个test方法,你会说了,T到底是什么东西,我不知道,你怎么就知道替换T的类型里就有pagedown这个方法呢?这是完全不合理的吗!!!所以这个一定不会通过编译!!!

 

好了,确实这个不会通过编译!!当然这是在java中的结果!!

 

--------------------Configuration: <Default>--------------------
E:/Code/Java/TIJ-MY/Test.java:32: 找不到符号
符号: 方法 pagedown()
位置: 类 java.lang.Object
    public void test(T a){a.pagedown();}
                           ^
1 错误

Process completed.

 

呵呵,似乎很正常!!

 

看看下面的C++代码:

 

#include<iostream>

using namespace std;

template<class T> class M{
T obj;
public:
 M(T x){obj=x;}
 void m(){obj.f();}
};


class HasF{
public:
 void f(){cout<<"HasF::f()"<<endl;}
};

int main()
{
HasF hf;
M<HasF> m(hf);
m.m();
return 0;
}

 

 

------ 已启动生成: 项目: CppFile, 配置: Debug Win32 ------
正在编译...
hello.cpp
正在编译资源清单...
Microsoft (R) Windows (R) Resource Compiler Version 6.0.5724.0
Copyright (C) Microsoft Corporation.  All rights reserved.
正在链接...
正在嵌入清单...
Microsoft (R) Windows (R) Resource Compiler Version 6.0.5724.0
Copyright (C) Microsoft Corporation.  All rights reserved.
生成日志保存在“file://e:/Code/NET/C++语言/CppFile/CppFile/Debug/BuildLog.htm”
CppFile - 0 个错误,0 个警告
========== 生成: 成功 1 个,失败 0 个,最新 0 个,跳过 0 个 ==========

 

输出:

 

HasF::f()

 

 

哈,似乎C++的本事比java的要大!!java 不能编译的情况下他却能编译!!这就合理了吗??

 

其实呢,我们先前以为的我们并不能预计不知道的类型中有什么样的方法的概念是一种直观的概念,我们以为不应该去揣测不知道的事情,我们应该做确定的事情!!是啊,在很多的情况下是这样的!!而java编译器正好满足了我们这样的想法!!但是C++却不一样,他会去关注事实,如果有他就调用,如果没有呢??当然就是编译时期的错误了!!其实某些设计也会用到这样的特性!!而java却不能提供给我们这样的特性!!因为java把类型参数都给擦除到了Object了!!

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值