首页 > 解决方案 > 这两个通用函数有什么区别?

问题描述

正如标题所说,我想知道这些功能之间的区别是什么。为什么我应该/不应该<T>在 foo2 中提供

public class Base<T> {

    public T[] foo(int i){
        /*Do something*/

    }

    public <T> T[] foo2(int i){
        /*Do something*/
    }

}

标签: javagenerics

解决方案


你的T第二个函数隐藏了T你的类的类型参数。这意味着T在第二个函数中引用了不同的类型T。这种命名是混乱的,应该避免。

当然,如果您确实想引用不同的泛型类型,您可以这样做,但您应该以不同的方式命名类型参数。以下示例与您的示例等效,但不隐藏T定义于Base

public class Base<T> {

    public T[] foo(int i){
        /*Do something*/

    }

    public <S> S[] foo2(int i){
        /*Do something*/
    }
}

推荐阅读