参数化方法调用什么时候有用?

2024-04-24

Java 方法调用可以像下面的代码一样进行参数化:

class Test
{
    <T> void test()
    {
    }

    public static void main(String[] args)
    {
        new Test().<Object>test();
        //         ^^^^^^^^
    }
}

我从 Eclipse Java Formatter 设置对话框中发现这是可能的,并想知道是否有任何情况下这是有用或需要的。


EDIT

根据阿恩的出色回答,我得出以下结论:

除了提高类型安全性(如 Arne 的示例所示)之外,参数化方法调用还使您能够指定方法参数的公共基类型,该参数应该是容器元素的类型。该类型通常由编译器自动推断为最具体的公共基类型。通过参数化方法调用,可以覆盖此行为。如果编译器推断出多种常见类型,则可能需要参数化方法调用。

以下示例演示了该行为:

import java.util.Arrays;
import java.util.List;

class Test
{
    public static void main(String[] args)
    {
        Integer a=new Integer(0);
        Long    b=new Long(0);
        List<Object> listError=Arrays.asList(a, b);
        //error because Number&Comparable<?> is not Object
        List<Object> listObj=Arrays.<Object>asList(a, b);
        List<Number> listNum=Arrays.<Number>asList(a, b);
        List<Comparable<?>> listCmp=Arrays.<Comparable<?>>asList(a, b);
    }
}

此行为在 Java 语言规范第三版第 8.4.4 和 15.12.2.7 段中定义,但不容易理解。


我从未在实践中使用过它,但您可以想象使用它来实现类型安全。考虑以下方法:

<T> void method(T... items) {
    List<T> list = new ArrayList<T>();
    for (T item : items)
        list.add(item);
    System.out.println(list);
}

你可以这样称呼它:

o.<Object>method("Blah", new Long(0));
o.<Number>method(new Integer(100), new Long(0));

但这会引发编译器错误:

o.<Number>method("String", new Long(0));

因此,您有一个类型安全的通用方法,可以用于每个对象,而不仅限于特定的接口或类。

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

参数化方法调用什么时候有用? 的相关文章

随机推荐

  • Git 日志列表提交不包括从第一个分支中精心挑选的内容

    例如我有这个提交历史记录 让我们说在某个时刻release1几天后发布到生产环境 release2分支被释放 branch relase1包含从 master 精心挑选的 2 个提交 4 和 5 branch release2包含 2 个提
  • 通过调用prototype.constructor.apply实例化一个JavaScript对象

    让我从一个具体的例子开始 说明我正在尝试做的事情 我有一系列的年 月 日 小时 分钟 秒和毫秒组件 格式为 2008 10 8 00 16 34 254 我想使用以下标准构造函数实例化 Date 对象 new Date year month
  • 带有伪元素的 CSS 叠加

    如何使用伪元素创建 CSS 覆盖层 modal position fixed top 100px margin left auto margin right auto left 0 right 0 width 500px display n
  • 如何在 Webpack 5 中为 jsonwebtoken 填充缓冲区

    我正在升级到 Webpack 5 并且 jsonwebtoken 包存在问题 https github com auth0 node jsonwebtoken https github com auth0 node jsonwebtoken
  • ValueError:输入包含 nan 值 - 来自 lmfit 模型,尽管输入不包含 NaN

    我正在尝试使用 lmfit 构建模型 链接到文档 https lmfit github io lmfit py model html the model class我似乎不明白为什么我总是得到一个ValueError The input c
  • Dagger 2 - 如何创建/提供 EagerSingleton

    我在使用 Dagger 2 依赖注入框架时遇到问题 我想创建一个渴望单例 我假设当我使用 dagger 2 时会创建延迟加载的单例 Singleton注解 我如何创建渴望单例使用 Dagger 2 框架 我通过创建一个解决了这个问题Eage
  • 在 Internet Explorer 中重定向时保留 URL 片段

    我目前面临单页应用程序中 URL 片段的挑战 登录时 用户将通过 Struts 重定向到包含 URL 片段 哈希 锚点部分的 url
  • 在不同长度的数组中查找相同的日期时间

    考虑以下儒略日期数组 Jday1 datenum 2011 01 01 00 00 yyyy mm dd HH MM 60 60 24 datenum 2011 12 31 23 00 yyyy mm dd HH MM Jday2 date
  • 如何平移 UIImageView 内的图像?

    我有一个UIImageView显示比实际图像更宽和更高的图像UIImageView是 我想使用动画在视图中平移图像 以便平移漂亮且平滑 在我看来 我应该能够调整bounds origin of the UIImageView 并且图像应该移
  • 如何在ubuntu 12.0中更新openerp 7中的新模块? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 完成 在 ubuntu 12 0 中更新 openerp 7 中的新模块的所有可能方法 还有其他方法可以更新 ubuntu 12 0 中
  • 如何在flutter中解析json?

    我想创建一个新闻应用程序 并且我使用 newsapi org 作为来源 我正在尝试获取来自 Http 库的 JSON 数据 我在下面提供了完整的代码 它没有给我任何错误 但没有加载数据 当我打印数据时 它打印一切正常 但我无法显示它 我不知
  • 如何在 QML 中使用 Font Awesome

    有谁知道如何在 QML 中使用 Font Awesome 吗 我找不到任何文档或任何信息如何在 QML 中使用 Font Awesome 我喜欢做的是使用fontello http fontello com 创建最小的图标集 而不是从 Fo
  • 在 UIWebView 中更改用户代理

    我的业务需要能够为嵌入式 UIWebView 自定义 UserAgent 例如 如果用户使用应用程序的一个版本与另一个版本 我希望服务器做出不同的响应 是否可以像 Windows 应用程序中的嵌入式 IE 浏览器那样在现有 UIWebVie
  • 查找多模块 Maven Reactor 项目的根目录

    有没有一种简单的方法可以找到多模块 Maven 项目的根 例如 Gradle 的rootDir 背景 我想使用 maven dependency plugin 将多模块项目的所有子模块中的工件复制到相对于整个项目的根目录的目录 也就是说 我
  • 如何在 XAML 上设置 ResourceDictionary FontSize?

    如果这会是一件混乱的事情 我深表歉意 我对 Xamarin 还很陌生 目前我正在尝试将此资源字典代码转换为 XAML Current Resources new ResourceDictionary FontResources Defaul
  • 设计 EAP-TLS 客户端问候消息

    我正在尝试设计第一个启动 EAP TLS 握手的数据包 这是我的数据包目前的样子 我通过用相应的信息手动填充 C 中的缓冲区来设计 EAP 部分 我使用 OpenSSL 导出的 TLS 部分如图所示在这个问题中 https stackove
  • 如何在 MS Access 表单上动态保持控件居中(相对位置)?

    我正在使用 Access 2013 并且有许多控件 列表框 按钮等 当调整表单大小时 我希望它们作为一个组在表单上保持居中 锚定无法实现我正在寻找的目标 因为我不想将控件锁定到顶部 底部 左侧 右侧 我希望他们留在中心 只需使用这样的代码m
  • 在 C++ 中清除控制台

    我正在尝试清除 C 中的控制台 我知道打印多个换行符是一种不好的做法 因为它可能很慢 并且完全清除控制台窗口并不总是可靠的 但我研究了多种选项 除了发现几乎没有其他解决方案system cls 这是一个更糟糕的选择 本质上 我用过这条线co
  • 输入:页面加载时应用了无效的 css 规则

    在 Firefox 或 Chrome 中查看这两个 fiddle 在this http jsfiddle net hezgkxoh 2 一 我只有一个简单的表格required属性和一个submit按钮 当框为空时按 提交 会导致其样式为i
  • 参数化方法调用什么时候有用?

    Java 方法调用可以像下面的代码一样进行参数化 class Test