Javaの汎用型とC++のテンプレート

2402 ワード

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つの方法で解決できます.以下、それぞれ例を挙げる.
//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における汎用メソッドを関数テンプレートで実現できるのは当然である.