为什么需要等效方法重载?

2023-11-27

我浏览了Google制作的一些JAVA代码,发现了ImmutableSet:http://google-collections.googlecode.com/svn/trunk/javadoc/com/google/common/collect/ImmutableSet.html

他们用其他几种方式实现了 of() 方法:

public static <E> ImmutableSet<E> of(E e1, E e2);
public static <E> ImmutableSet<E> of(E e1, E e2, E e3);
public static <E> ImmutableSet<E> of(E e1, E e2, E e3, E e4);
public static <E> ImmutableSet<E> of(E e1, E e2, E e3, E e4, E e5);
public static <E> ImmutableSet<E> of(E... elements);

我检查了这里的实现:https://code.google.com/p/google-collections/source/browse/trunk/src/com/google/common/collect/ImmutableSet.java

有一个具有以下签名的 create 方法:

private static <E> ImmutableSet<E> create(E... elements)

它包裹着

private static <E> ImmutableSet<E> create(Iterable<? extends E> iterable, int count);

方法。公共方法只是将参数传递给 create(E... elements) 签名方法,该方法最终调用另一个 create 方法。

我猜想具有固定参数数量的方法的 public 是不必要的,因为我们有 of(E... elements) 方法。

我的问题是他们为什么这样做?表现?或者它是一种模式?

Thanks.


实际上,它与性能无关:所有方法都委托给同一个创建方法,该方法无论如何都需要一个数组。

我的猜测是它与警告有关。考虑以下最小片段:

import java.util.List;

class ImmutableSet<T>
{
}
public class ParametersTest
{
    public static void main(String[] args)
    {
        List<String> list0 = null;
        List<String> list1 = null;
        of(list0, list1);
    }

    @SuppressWarnings("unchecked")
    public static <E> ImmutableSet<E> of(E e1, E e2) {
        return create(e1, e2);
    }

    public static <E> ImmutableSet<E> of(E... elements) {
        return create(elements);
    }

    private static <E> ImmutableSet<E> create(E... elements) 
    {
        return null;
    }

}

致电给of在 main 方法中很好:它与 2-args-version 的of方法。现在注释掉 2-args-versionof-方法。然后调用还是可以的,但是会直接调用varags版本。这将导致创建通用数组并引发警告。 (显然,这个警告在 2-args-version 中被抑制了)。

总而言之,我认为这是为了避免向想要调用of具有多个泛型类型对象的方法。

幸运的是,以后不再需要这样的事情了,感谢http://docs.oracle.com/javase/7/docs/api/java/lang/SafeVarargs.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么需要等效方法重载? 的相关文章

随机推荐

  • .NET Core 相当于 Thread.Abort

    背景 我有一个Service抽象 每个服务都有自己的WorkItem 工作项能够从一些数据开始 该服务正在限制执行时间WorkItem 假设单个工作项最多可能需要 60 秒 在此之后 Service应该杀掉它 这段代码从 NET Frame
  • Android TimePickerDialog材质设计颜色

    我在我的应用程序中使用时间选择器对话框 我还使用 appcompat 来为我的应用程序提供材料设计主题 然而 该对话框保留默认的青色强调色 我的强调色是浅蓝色 所以在我的代码中我尝试将对话框主题设置为我自己的并且它可以工作接受它使其全屏显示
  • 获取 java.util.List 的泛型类型

    I have List
  • 如何使用 Node.js“执行”HTML+Javascript 页面

    这样 我就有了 Node js 脚本 我有一些 HTML 页面 其中包含带有 JavaScript jquery 的 HTML 如何加载它并获取该页面上 JavaScript 的执行结果 你可以检查zombie js项目 http zomb
  • (React) CSSTransition 与 css 模块

    我正在尝试在我的项目中实现 CSSTransition 到模式 问题是我正在使用 css 模块 我的模态的渲染方法 render return
  • 检测 html 表单是否被编辑的通用方法

    我有一个选项卡式 html 表单 从一个选项卡导航到另一选项卡时 即使数据没有更改 当前选项卡的数据也会保留 在数据库上 我想仅在编辑表单时才进行持久性调用 该表单可以包含任何类型的控件 不一定要通过键入一些文本来弄脏表单 但在日历控件中选
  • 如果为空则创建新实例的简写?

    在 Javascript 中我可以这样做 var myVar returnNull new MyObject 在 C 中 我目前正在这样做 var myVar returnObjectOrNull if myVar null myVar n
  • 在 mongodb 中存储赞成票/反对票

    我有一个收藏Posts and Users用户可以对每个帖子投赞成票 反对票 将其存储在 mongodb 数据库中以确保用户不能多次为给定文档投票的最佳方法是什么 我想出的最简单的 nosql ish 解决方案是存储在每个内部投票的 use
  • 跨平台网络 API [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 我想知道是否有一个 API 可以在 Windows Mac 和 Linux 上运行网络 我想做一个2人可以通过TCP连接玩的纸牌游戏 有几个选项可以
  • 使用ngrx一次获取store的当前状态

    您好 我想知道是否有人知道如何在无需订阅的情况下获取商店的当前状态 我目前正在使用 ngrx 订阅商店并访问其状态以设置组件的属性 但由于我订阅了该属性 所以它会不断刷新 因此 我正在寻找一种仅获取此属性一次的方法 以便我可以显示数据而无需
  • Android 滑动布局来关闭

    我正在尝试制作一个可滑动的布局 这样你就可以像现在在谷歌中一样滑动它来关闭 我设法使用以下代码让它在诸如按钮之类的视图上工作 SwipeDismissTouchListener public class SwipeDismissTouchL
  • 为什么 C# 似乎部分未转义命令行参数?

    我试图将多个路径作为参数传递给控制台应用程序 但收到 路径中的非法字符 错误 参数的最后两个字符似乎出现了错误 C test 对于转义的双引号 例如 如果我用 C 创建一个新的空控制台应用程序 如下所示 static void Main s
  • 命令光标的对象不可下标

    我是 Python 和 MongoDB 的新手 我正在使用 Flask python 和 MongoDB 开始一个新项目 当我尝试使用返回数据时aggregate 函数 它给我以下错误 命令光标的对象不可下标 这是我的查询代码 Data d
  • 使用 contenteditable div 而不是 textarea 的自动完成似乎不起作用

    我正在使用 Andrew Whitaker 的自动完成插件 这个问题也提到了 jquery 自动完成 mention 如果我使用 contenteditable div 而不是文本区域 这将不起作用 这是我的代码 div div MyTex
  • Python 中的曲面曲率 Matlab 等效项

    我试图计算由点数组 x y z 给出的曲面的曲率 最初我试图拟合多项式方程 z a bx cx 2 dy exy fy 2 然后计算高斯曲率 K frac F xx cdot F yy F xy 2 1 F x 2 F y 2 2 然而 如
  • 如何检查两个模板参数是否完全相同?

    如何修改以下函数模板 使其返回 42 if 模板参数T and U是完全相同的类型吗 template
  • 运行用 C 编写的程序时“未找到”Cygwin1.dll。如何让 Windows 找到它?

    所以我试图运行我的第一个用 C 编写的 hello world 程序 IS 在 eclipse 中编译它并且没有错误 但是当我尝试运行它时我得到 此应用程序无法启动 因为找不到 cygwin1 dll I found 这个帖子这似乎表明我应
  • 获取属性的 JsonPropertyAttribute

    我发现一篇文章对我遇到的问题提供了很好的答案 但我似乎找不到我正在寻找的小细节 public class myModel JsonProperty PropertyName id public long ID get set JsonPro
  • Java 中的花括号本身意味着什么?

    我有一些 Java 代码以两种方式使用花括号 Curly braces attached to an if statement if node getId null node getId apply this Curly braces by
  • 为什么需要等效方法重载?

    我浏览了Google制作的一些JAVA代码 发现了ImmutableSet http google collections googlecode com svn trunk javadoc com google common collect