Java 泛型和设计模式:不参数化对泛型类型的引用总是一件坏事?

2024-04-20

这个问题与我的上一个问题部分相关question https://stackoverflow.com/questions/7300163/java-generic-programming-with-unknown-generic-type-of-interface.

我有一个泛型类,表示泛型对象的集合:

public interface MyObject<N extends Number>{}

public interface MyCollecion<N extends Number> {
    public foo(MyObject<N> obj)
}

在我的设计中,这些对象集合是由客户端类(我们称之为 CollectionBuilder)通过抽象类方法构造的:

public interface AbstractCollectionFactory {
    public abstract <N extends Number> MyCollection<MyObject<N>> createCollection(String collectionType);

}

通用集合应该这样构建:

public class CollectionBuilder{
    AbstractCollectionFactory f;
    public void buildDoubleCollection(){

         MyCollection<MyObject<Double>> c = f.<Double>createCell("MyType");
    }
    public void buildIntegerCollection(){...}
}

好吧,既然这里一切都好。 CollectionBuilder 知道要指定的通用具体类型(在本例中为 Double)并且可以正确构建。我可以在没有警告的情况下编译它,并且一切都应该正常工作。

现在我有一个与泛型和程序设计相关的问题。

我的应用程序中有另一个类需要使用 CollectionBuilder 构建的集合(我们将此类称为 UserClass)。 用户类:

  1. 不需要知道它的集合是哪个特定的具体类型(MyCollection<MyObject<Double>> or MyCollection<MyObject<Integer>>).
  2. 调用 MyCollection 接口中定义的一些方法对这些集合执行一些操作。
  3. 我不想向其中添加泛型类型。

在所描述的情况下,不对 UserClass 中的泛型类 MyCollection 进行参数化是一个坏主意吗?

public UserClass{
     MyCollection a;  //warning 
     MyCollection<?> b; //no warning

     public method(MyObject o){  //warning
          a.foo(b); //compile       
     }
     public method2(MyObject<?> o){
          b.foo(o); //error do not compile
     }
}

如果我不指定泛型参数,Java 编译器总是会发出警告抗议。无论如何,从 UserClass 内部我不知道具体参数(我想不知道),甚至用“?”来声明它。不允许我在 MyCollection 上调用方法 foo。

所以问题是:

  1. 不参数化对泛型类型的引用总是一件坏事?
  2. 如果 1 的答案是否定的,那么这是不这样做的正确情况吗?
  3. 如果 1 的答案是“是”,我如何在不知道 UserClass 内部的泛型类型的情况下使用 MyCollection 方法?
  4. 我的设计很糟糕吗?

我希望已经说清楚了。我几天来一直在为这个问题苦苦挣扎,但我不知道。请帮我。


  1. 根据Java编译器的说法,是的。和这个答案 https://stackoverflow.com/questions/4337313/why-is-class-preferred-to-class包含很多关于原因的好观点。我个人在某些情况下不同意,特别是使用Class担心(例如,如果您有Map<Class, Object>)。在这种情况下必须始终坚持<?>到“Class”的末尾感觉像是不必要的单调乏味,并且不会使代码更具可读性。

    拥有的想法Class对我来说,根据它所关联的对象类型进行参数化一开始总是感觉有点可疑。要点是Class是有一个通用接口,可用于获取有关任何对象(ala 反射)的信息,无论其类型如何。

    但我离题了。根据 Java 编译器和泛型类型的实现者,您应该始终参数化您的引用,即使您只使用<?>.

  2. 不适用。尽管您始终可以不声明任何类型信息,然后使用@SuppressWarnings("unchecked")以及显式强制转换以使编译器满意。

  3. 请参阅波西米亚人的回答。

  4. 确实没有足够的信息可说。虽然我的脑海中浮现出这样的想法,但我不确定“代表通用对象集合的通用类”的实际用例是什么。为什么不直接使用集合呢?

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

Java 泛型和设计模式:不参数化对泛型类型的引用总是一件坏事? 的相关文章

  • JPA 中的复合键

    我想创建一个具有自动生成的主键的实体 而且还有一个由其他两个字段组成的唯一复合键 我如何在 JPA 中执行此操作 我想这样做是因为主键应该用作另一个表中的外键 并且使其复合并不好 在下面的代码片段中 我需要命令和模型是唯一的 pk当然是主键
  • 如何在 Firebase 远程配置中从 JSON 获取值

    我是 Android 应用开发和 Firebase 的新手 我想知道如何获取存储在 Firebase 远程配置中的 JSONArray 文件中的值 String 和 Int 我使用 Firebase Remote Config 的最终目标是
  • JVisualVM/JConsole 中的 System.gc() 与 GC 按钮

    我目前正在测试处理 XML 模式的概念验证原型 并围绕一个非常消耗内存的树自动机外部库 我已经获得了源代码 构建 我想绘制 真实峰值 堆 随着模式大小的增加 不同运行的内存消耗 使用的指标符合我的目的并且不会影响问题 或者至少是它的合理近似
  • org.hibernate.QueryException:无法解析属性:文件名

    我正在使用休眠Criteria从列中获取值filename在我的桌子上contaque recording log 但是当我得到结果时 它抛出异常 org hibernate QueryException 无法解析属性 文件名 com co
  • Spring Security SAML2 使用 G Suite 作为 Idp

    我正在尝试使用 Spring Security 5 3 3 RELEASE 来处理 Spring Boot 应用程序中的 SAML2 身份验证 Spring Boot 应用程序将成为 SP G Suite 将成为 IDP 在我的 Maven
  • ConcurrentHashMap 内部是如何工作的?

    我正在阅读有关 Java 并发性的 Oracle 官方文档 我想知道Collection由返回 public static
  • 如何检测 Java 字符串中的 unicode 字符?

    假设我有一个包含 的字符串 我如何找到所有这些 un icode 字符 我应该测试他们的代码吗 我该怎么做呢 例如 给定字符串 A X 我想将其转换为 AYXY 我想对其他 unicode 字符做同样的事情 并且我不想将它们存储在某种翻译映
  • 套接字的读写如何同步?

    我们创建一个套接字 在套接字的一侧有一个 服务器 在另一侧有一个 客户端 服务器和客户端都可以向套接字写入和读取 这是我的理解 我不明白以下事情 如果服务器从套接字读取数据 它在套接字中是否只看到客户端写入套接字的内容 我的意思是 如果服务
  • 生成的序列以 1 开头,而不是注释中设置的 1000

    我想请求一些有关 Hibernate 创建的数据库序列的帮助 我有这个注释 下面的代码 在我的实体类中 以便为合作伙伴表提供单独的序列 我希望序列以 1000 开头 因为我在部署期间使用 import sql 将测试数据插入数据库 并且我希
  • 了解joda时间PeriodFormatter

    我以为我明白了 但显然我不明白 你能帮我通过这些单元测试吗 Test public void second assertEquals 00 00 01 OurDateTimeFormatter format 1000 Test public
  • GWT 2.3 开发模式 - 托管模式 JSP 编译似乎不使用 java 1.5 兼容性

    无法编译 JSP 类 生成的 servlet 错误 DefaultMessage 上次更新 0 日期 中 0 时间 HH mm ss z 语法 错误 注释仅在源级别为 1 5 时可用 在尝试以开发模式在 Web 浏览器中打开我的 gwt 模
  • QuerySyntaxException:无法找到类

    我正在使用 hql 生成 JunctionManagementListDto 类的实际 Java 对象 但我最终在控制台上出现以下异常 org hibernate hql internal ast QuerySyntaxException
  • 使用布尔值进行冒泡排序以确定数组是否已排序

    我有以下用于冒泡排序的代码 但它根本不排序 如果我删除布尔值那么它工作正常 我知道 由于我的 a 0 小于所有其他元素 因此没有执行交换 任何人都可以帮助我解决这个问题 package com sample public class Bub
  • Spring-ws:如何从没有“Request”元素的 xsd 创建 Wsdl

    尝试为客户端实现 SOAP Web 服务 我需要一个 wsdl 文件来通过soapUI 测试该服务 但正如您在下面看到的 这个 xsd 没有 Request 和 Response 方法 所有请求和响应都被定义为基本 ServiceProvi
  • Hamcrest Matchers - 断言列表类型

    问题 我目前正在尝试使用 Hamcrest Matchers 来断言返回的列表类型是特定类型 例如 假设我的服务调用返回以下列表 List
  • Resteasy 可以查看 JAX-RS 方法的参数类型吗?

    我们使用 Resteasy 3 0 9 作为 JAX RS Web 服务 最近切换到 3 0 19 我们开始看到很多RESTEASY002142 Multiple resource methods match request警告 例如 我们
  • 使用按钮作为列表的渲染器

    我想使用一个更复杂的渲染器 其中包含列表的多个组件 更准确地说 类似于this https stackoverflow com questions 10840498 java swing 1 6 textinput like firefox
  • 如何重新启动死线程? [复制]

    这个问题在这里已经有答案了 有哪些不同的可能性可以带来死线程回到可运行状态 如果您查看线程生命周期图像 就会发现一旦线程终止 您就无法返回到新位置 So 没有办法将死线程恢复到可运行状态 相反 您应该创建一个新的 Thread 实例
  • Java中HashMap和ArrayList的区别?

    在爪哇 ArrayList and HashMap被用作集合 但我不明白我们应该在哪些情况下使用ArrayList以及使用时间HashMap 他们两者之间的主要区别是什么 您具体询问的是 ArrayList 和 HashMap 但我认为要完
  • 配置“DataSource”以使用 SSL/TLS 加密连接到 Digital Ocean 上的托管 Postgres 服务器

    我正在尝试托管数据库服务 https www digitalocean com products managed databases on 数字海洋网 https en wikipedia org wiki DigitalOcean 创建了

随机推荐

  • .htaccess 中的多个 mod_rewrite 规则

    我很难让多个 mod rewrite 规则在我的 htaccess 文件中协同工作 在整个网站中 我想删除 www 来自所有 URL 我在文档根目录中使用以下内容 Options FollowSymLinks RewriteCond HTT
  • jsfiddle如何标记代码?有这个库吗?

    如果您曾经使用过 www jsfiddle net 您可能会注意到它用适当的颜色标记代码 以及各种其他帮助程序 例如将制表符转换为四个空格或shift tab 通过 Firebug 我看到它是通过 iFrame 来完成此操作的 有没有开源库
  • Clock_nanosleep() 尚不支持 CLOCK_MONOTONIC_RAW。这该如何处理呢?

    现在clock nanosleepDebian Jessie 上的 CLOCK MONOTONIC RAW 返回 EOPNOTSUPP 如何解决该问题并补偿可能应用于计时器循环中的 CLOCK MONOTONIC 的 NTP 调整 Is c
  • Oracle/SQL中ROWID的数据类型

    Oracle SQL中ROWID的数据类型是什么 这个值是如何存储的 以下链接解释了 ROWID 的数据类型是什么 ROWID 数据类型 http docs oracle com cd B19306 01 server 102 b14200
  • 如何在 emacs 中对多种语言进行拼写检查?

    我主要使用 HTML 编写文档emacs作为我的主要编辑 Emacs 允许您使用以下命令以交互方式对当前缓冲区进行拼写检查ispell buffer 由于我在多种语言之间切换 因此我在文件末尾有一个 HTML 注释 指定该文件的主词典和个人
  • Github 贡献日历日开始时间

    几天前 Github 推出了他们的新功能 贡献 https github com blog 1360 introducing contributions 我有一个疑问 这个日历的一天开始时间是几点 是使用我的本地时间还是 UTC 如果它使用
  • C语言中如何将负零转换为正零?

    你好 我正在学习 Objective C 我正在做经典的计算器示例 问题是 当我将零乘以任何负数时 我得到负零 并将结果放入 双 类型 为了看看发生了什么 我使用了调试器 这就是我得到的结果 gdb 打印 2 0 1 0 gdb 打印 双精
  • Jquery 搜索 - 不区分大小写

    我在 Jquery 脚本上获得了一些帮助 该脚本创建了可搜索 可切换的常见问题解答 代码可以在这里看到 http jsfiddle net pT6dB 62 http jsfiddle net pT6dB 62 问题是 如果单词 How 带
  • JBoss AS 6 中的 QuartzScheduler 注入

    如何将 QuartzScheduler 服务注入 JBoss AS 6 上的无状态 bean 中 Quartz 服务在 JBoss AS 6 启动期间启动 00 58 38 025 INFO QuartzScheduler Schedule
  • Glassfish 4 中的密码加密算法

    我最近将 Glassfish 从 3 1 2 更新到 4 0 并希望设置一个我之前在我的应用程序上使用过的 JDBCRealm 该应用程序使用基于 FORM 的身份验证 密码在数据库中使用 SHA 256 进行哈希处理 这是默认的摘要算法选
  • 查找目录中最新的文件而不读取其所有内容

    我试图在一个巨大的文件系统中找出最新的文件 一种方法是浏览所有目录 一次一个 读取其内容 选择最新文件等 明显的缺点是我必须得到all特定目录中的文件 我想知道 Python 1 中是否有一个 Unix 支持的 神奇 调用来获取目录中的最新
  • Lua中如何获取目录列表

    我需要 LUA 中的目录列表 假设我的目录路径为 C Program Files 我需要该特定路径中所有文件夹的列表以及如何搜索该列表中的任何特定文件夹 Example 需要路径 C Program Files 中所有文件夹的列表 以下是上
  • 如何使用 Ruby 在现有 PDF 上编辑或书写?

    我有几个 PDF 模板文件 其中包含复杂的内容和几个空白区域 区域 我需要能够在这些空白区域写入文本并将生成的 PDF 保存在文件夹中 我在谷歌上非常集中地搜索了这个问题的答案 但没有找到明确的答案 更好的解决方案之一是PDF 工具包 ht
  • 读取由其他线程上的 Interlocked 更新的 int

    这是重复 如何正确读取 Interlocked Increment ed int 字段 https stackoverflow com questions 6139699 how to correctly read an interlock
  • mysql 选择不同的字母,包括扩展拉丁字符

    原问题 表结构 CREATE TABLE texts letter VARCHAR 1 CHARACTER SET utf8 COLLATE utf8 general ci NOT NULL text VARCHAR 255 CHARACT
  • 创建具有特定键的对象数组,然后从对象中删除该键

    我使用 lodash 从特定键创建对象数组 然后从其对象中删除该给定键 我有这个 var cars itemID KUsw42xU S1qA y3TiI use this as key name Car One qtd 1 itemID K
  • 在 jQuery 中获取默认服务器时间?

    如何使用 jQuery 获取网络服务器时间 这是一种无需服务器端任何特定代码甚至有效路径即可工作的方法 try var date new Date ajax type HEAD url getResponseHeader Date catc
  • VIM:在窗口左侧显示 3 个字符边框

    Context 我正在使用 NERDTree 插件 让我烦恼的一件事是 NERDTree 本身和我的代码之间的视觉垂直边界 我发现阅读我的代码有点烦人 我当前的设置如下所示
  • Minix 与 Linux 相比如何学习操作系统设计?

    我想学习操作系统设计 我想知道在此过程中我是否应该解决 Minix 或 GNU Linux 问题 我喜欢书籍 所以我主要关注一本书 尽管视频资源 大概是录像讲座 也很受欢迎 我已经正式学习了 C 和 C 可以用它们编写中小型程序 我对数据结
  • Java 泛型和设计模式:不参数化对泛型类型的引用总是一件坏事?

    这个问题与我的上一个问题部分相关question https stackoverflow com questions 7300163 java generic programming with unknown generic type of