CSDN博客

img cnweike

java泛型解析02

发表于2008/9/28 10:17:00  563人阅读

/**
 * @(#)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了!!

 

 

0 0

相关博文

我的热门文章

img
取 消
img