文档章节

Java中的泛型与C++中的模板

Flue
 Flue
发布于 2015/10/01 12:23
字数 622
阅读 54
收藏 0

    1.Java中的类持有对象引发的关于类泛型的思考

//1.一个持有单个对象的类
class Fruit{}
public class Demo{
    private Fruit fruit;
    public Demo(){}
    public Demo(Fruit fruit){
        this.fruit = fruit;
    }
    public Fruit get(){
        return fruit;
    }
    public void set(Fruit newFruit){
        fruit = newFruit;
    }
    //重写toString()
    public String toString(){
        return "Fruit in Demo.";
    }
    
    public static void main(String[] args){
        Demo demo = new Demo(new Fruit());//Demo对象只能持有Fruit实例
        System.out.println(demo);
    }
}

在以上Demo类中,所有的Demo实例都只能持有Fruit对象作为其数据成员,使用范围很小。可以通过两个方法解决此类问题,一是将类持有的对象声明为基类(比如Object)以实现类持有基类及其派生类的功能,二是通过Java中的泛型来泛化类的参数,实现类型参数。以下分别举例。

//2.声明类持有成员为基类实现类型参数
class Demo1{
    private Object obj;
    public Demo1(){}
    public Demo1(Object obj){
        this.obj = obj;
    }
    //以下省略访问器与更改器方法和重载的toString()
    //...
}
//3.通过泛型实现类型参数
class Demo2<T>{
    private T t;
    public Demo2(){}
    public Demo2(T t){
        t = this.t;
    }
    //以下省略访问器与更改器方法和重载的toString()
    //...
}
//测试类
class Car{}
public class Test{
    public static void main(String[] args){
        Demo1 first = new Demo1(new String());//Demo1的实例first持有String对象
        Demo1 second = new Demo1(new Car());//Demo1的实例second持有Car对象
        Demo2<Car> instance1 = new Demo2<Car>(new Car());//Demo2的实例instance1持有Car对象
        Demo2<String> instance2 = new Demo2<String>(new String());//Demo2的实例instance2持有String对象
    }
}

        2.一个C++的简单模板类

#include<iostream>
using namespace std;

template<class T>
class Demo{
    private:
        T t;
    public:
        Demo();
        Dmeo(T first, T second);
        void set(T t);
        T get() const;     
};
template<class T>
Demo<T>::Demo(){}

template<class T>
Demo<T>::Demo(T t){
    this->t = t;
}

template<class T>
void Demo<T>::set(T t){
    this->t = t;
}

template<class T>
T Demo<T>::get() const{
    return t;
}

int main(){
    //...
    return 0;
}
//写C++还是比较辛苦的

    总的来说,Java中引进的泛型还是和C++中的模板很相像的,当然,这都是出于类型参数的理解。另外,在Java中可以单独为方法应用泛型,而C++自不必说,本来就是兼具过程式与面向对象的编程模式,自然可以用函数模板实现Java中的泛型方法。

© 著作权归作者所有

上一篇: Groovy流程控制
下一篇: Groovy流程控制
Flue
粉丝 0
博文 2
码字总数 1006
作品 0
延安
私信 提问
献给入门C++/Java选择困难综合症患者

如何让技术群活跃起来?PHP是世界上最好的语言。 没有优秀之分,否则只能显得你不懂另一门语言。如果你想学,那么请远离C/C++,请使用Java,以一个学长的身份,阐述一下。C++向后兼容C,这句...

LoSingSang
2018/12/26
52
3
一 C家族的故事

一 C家族的故事 以下描述摘自《C++对话系列》 “最初,计算机语言非常混乱,高级语言根本不存在,连固定的语言形式也没有。贝尔实验室的Richard Martin在使用了计算机语言的过程中意识到了高...

长平狐
2012/08/28
453
0
【翻译】C#编程语言和JAVA编程语言的比较(上)

【翻译】C#编程语言和JAVA编程语言的比较(上) 原文地址:http://www.25hoursaday.com/CsharpVsJava.html 简介 C#语言是一门面向对象的语言,开发者可以使用C#和微软.NET平台快速构建各种应...

fbf
2013/08/13
306
0
Python和Java的语法对比,语法简洁上python的确完美胜出

Python是一种广泛使用的解释型、高级编程、通用型编程语言,由吉多·范罗苏姆创造,第一版发布于1991年。可以视之为一种改良(加入一些其他编程语言的优点,如面向对象)的LISP。Python的设计...

急速奔跑中的蜗牛
05/19
0
0
深入理解Scala - 复合语言

本文内容主要来自《Scala in Depth》的第一章。主要介绍Scala是一门集面向对象编程和函数编程的复合语言。 多范型语言 Scala除了是面向对象和函数式的语言外,它还是: 泛型语言 脚本语言 命...

开源中国驻成都办事处
2014/04/03
1K
2

没有更多内容

加载失败,请刷新页面

加载更多

堆”和“栈

C++作为一款C语言的升级版本,具有非常强大的功能。它不但能够支持各种程序设计风格,而且还具有C语言的所有功能。我们在这里为大家介绍的是其中一个比较重要的内容,C++内存区域的基本介绍。...

SibylY
25分钟前
2
0
总结:Https

一、介绍 简单理解,https即在http协议的基础上,增加了SSL协议,保障数据传输的安全性。 它由以前的http—–>tcp,改为http——>SSL—–>tcp;https采用了共享密钥加密+公开密钥加密的方式 ...

浮躁的码农
28分钟前
3
0
数据库表与表之间的一对一、一对多、多对多关系

表1 foreign key 表2 多对一:表 1 的多条记录对应表 2 的一条记录 利用foreign key的原理我们可以制作两张表的多对多,一对一关系 多对多: 表1的多条记录可以对应表2的一条记录 表2的多条记...

Garphy
58分钟前
7
0
MySQL 表崩溃修复

MySQL日志报错 2019-10-19 13:41:51 19916 [ERROR] /usr/local/mysql/bin/mysqld: Table './initread_hss/user_info' is marked as crashed and should be repaired2019-10-19 13:41:51 1......

雁南飞丶
今天
6
0
Error和Exception

1.Error类和Exception类都是继承Throwable类 2.Error(错误)是系统中的错误,程序员是不能改变的和处理的,是在程序编译时出现的错误,只能通过修改程序才能修正。一般是指与虚拟机相关的问...

大瑞清_liurq
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部