今天在学数据结构的过程中,发现了一个问题。

为了保证线性表的有效性和普适性,线性表内的元素统一用泛型来定义,这让我不禁想到了Object类(身为所有类的祖类 也可以代表所有的类型) 所以来一探他们的区别。

重点:泛型的主要目的之一就是用来指定容器,而由编译器来保证类型的正确性。

参考了以下几篇博客

在JAVA中返回类型使用泛型T和Object有什么区别? - 系统攻城狮 - 博客园

问题:下面2个方法的声明有何不同

public Object doSomething(Object obj) {....}
​
public <T> T doSomething(T t) {....}

答案:

单从上文2个方法声明来说-没有区别。无论是T还是 obj,你都只能调用Object类型的参数和返回值。

但是基于上面2个方法,如果你有一个使用了泛型的类:

MyClass<Foo> my = new MyClass<Foo>();
Foo foo = new Foo();

就可以这么写:

Foo newFoo = my.doSomething(foo);

但是如果是使用object的话,就得这么写

Foo newFoo = (Foo) my.doSomething(foo);

由此可见,使用泛型,有2个好处:

1.不需要做强制类型转换

2.编译时更安全。如果使用Object类的话,你没法保证返回的类型一定是Foo,也许是其它类型。这时你就会在运行时得到一个类型转换异常(ClassCastException)

上边的可能我不好理解 所以我又找到了如下回答

(17条消息) 一分钟搞懂泛型和Object的区别?_唛唛丶Information Technology-CSDN博客

泛型声明

public <T> T doSomeThing(T t){ return t; }

Object声明

public Object doSomeThing(Object obj){
    return obj;
}

泛型引用

String result = doSomeThing("参数是String");

Object引用

String result = (String)doSomeThing("参数是String");

这样看就更加清晰了,其实Object和泛型的使用没什么大区别,区别只在于调用Object时要进行一个强转,将Object类型转换为接受值类型。

乍一看泛型和Object除了语法以外没有什么别的区别,不过为什么jdk1.5以后要出个泛型; 使用泛型最大的好处:不再需要强制转换,编译时自动检查类型安全,避免隐性的类型转换异常;

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐