在Java中,何时应该使用“Object o”而不是泛型?

时间:2008-12-10 02:48:40

标签: java generics

例如,我可以写下以下任何一个:

class example <T>
{
    ...

    public void insert (T data)
    {
        ...
    }
}

class example
{
    ...

    public void insert (Object o)
    {
        ...
    }
}

2在性能方面是否存在显着差异?使用泛型我可以限制参数的类型,并且使用第二种方法,我想在创建对象时没有必要定义对象的类型。

另外,使用第二种方法我基本上可以在课堂上插入任何内容,对吗?而对于泛型,类中的每个元素都是相同的类型。

我还缺少什么?

5 个答案:

答案 0 :(得分:9)

编写后者的唯一原因是您必须定位较早的JVM。泛型是通过类型擦除实现的,因此它们没有运行时影响 - 只增加了编译时间检查,这将改善您的代码。

当然,如果你需要一个包含任何旧对象的集合,或者有几个没有共同超类的混合,你需要普通的Object变体(但是你的类仍然可以是通用的,并用new实例化。 ..&LT;对象&gt;)

答案 1 :(得分:6)

我认为你几乎已经钉了它。没有性能差异。在编译代码时,泛型被合理化(Type Erasure),并且在运行时不再存在。他们只需在需要时添加强制转换,并按照您的说明进行类型检查。 Neal Gafter写了一篇关于它们如何工作的概述,Generics当前的问题以及如何在下一版Java中解决它们:http://gafter.blogspot.com/2006/11/reified-generics-for-java.html

答案 2 :(得分:3)

不应该有性能差异。

但是,Java不提供参数方差,因此在某些情况下,您将覆盖pre-generics函数,例如equals,compareTo等,您必须使用Objects。

答案 3 :(得分:0)

关于表现,我同意上述人士。

关于你的这一点

“另外,使用第二种方法我基本上可以在类中插入任何东西,对吧?对于泛型,类中的每个元素都是相同的类型。”

泛型的另一个优点是可以通过类型检查来分配示例实例本身。

例如,假设您有一个示例e1和另一个示例e2,类型安全将被维护,您将永远无法执行e1 = e2;

虽然有了对象示例,但这是可能的。

答案 4 :(得分:0)

我必须使用'对象'而不是泛型的一些遭遇是强迫而不是选择。使用预通用代码或围绕预通用api构建的库时,人们别无选择。例如,动态代理,Proxy.newProxy()返回Object类型。传递泛型上下文(上下文可以是任何东西)是另一个实例。我的一些朋友认为这与非仿制药一样好。就性能而言,考虑到类型擦除,不应有任何开销。