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{
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 instance1 = new Demo2(new Car());//Demo2的实例instance1持有Car对象
Demo2 instance2 = new Demo2(new String());//Demo2的实例instance2持有String对象
}
}
2.一个C++的简单模板类
#include
using namespace std;
template
class Demo{
private:
T t;
public:
Demo();
Dmeo(T first, T second);
void set(T t);
T get() const;
};
template
Demo::Demo(){}
template
Demo::Demo(T t){
this->t = t;
}
template
void Demo::set(T t){
this->t = t;
}
template
T Demo::get() const{
return t;
}
int main(){
//...
return 0;
}
//写C++还是比较辛苦的
总的来说,Java中引进的泛型还是和C++中的模板很相像的,当然,这都是出于类型参数的理解。另外,在Java中可以单独为方法应用泛型,而C++自不必说,本来就是兼具过程式与面向对象的编程模式,自然可以用函数模板实现Java中的泛型方法。