我偶尔听到,使用泛型,Java并没有正确地做到这一点。
请原谅我的经验不足,但有什么能让他们变得更好呢?
坏:
List<byte>
确实有a byte[]
作为支持,并且不需要装箱)好:
问题内容: 我正在使用泛型编写某些东西,令我惊讶的是,我发现这行不通: 那我不能实例化泛型吗?没有任何方法可以做到这一点吗? 问题答案: 是的,这真是令人讨厌。 我使用的解决方法是强制客户端在构造新类时传递类-即 然后您可以使用。
问题内容: 我正在尝试使用泛型实现以下结构。收到编译器错误,无法找出原因。 这个想法是译者使用T作为字典中键的类型。例如,可以是字符串或枚举。子类提供具体的字典。 但是它失败,因为:“类型’String’不符合协议’Hashable’” 但是String符合Hashable。它也不适用于Int,后者也符合Hashable。 如果删除类型约束,则仅用于测试(在此我还必须禁用字典,因为我不能在其中使用
问题内容: 我希望从编译时以及运行时的角度来看,提供正确类型的返回值都不会成为问题。 但是我一定是错的。 编辑: 它不与和。 问题答案: 根据该方法的Javadoc: 实际结果类型为| X | 是擦除其上调用的表达式的静态类型。例如,此代码段中不需要强制转换 在此,您的代码段中的值为,因此只能分配给或。 使用这种特定措辞的原因是因为当您说该变量具有类型T其中where时,可以存在多个扩展的类,因此
问题内容: 我想知道Java中是否有特殊原因总是使用“ ”而不是“ ”来定义类型参数的界限。 例: 被禁止但是 是正确的。是什么原因呢? 问题答案: 在类“实现”还是“扩展”之间,通用约束语言没有语义差异。约束可能性是“扩展”和“超级”-也就是说,该类是可分配给其他类的对象(扩展),还是该类可从该类分配(超级)。
问题内容: 为什么Java中的泛型只能用于类,而不能用于原始类型? 例如,这可以正常工作: 但这是不允许的: 问题答案: ava中的泛型是一个完全编译时的结构-编译器将所有泛型使用转换为正确的类型。这是为了保持与以前的JVM运行时的向后兼容性。 这个: 变成(大致): 因此,任何用作泛型的东西都必须可转换为Object(在此示例中返回),而原始类型则不是。因此它们不能用于泛型。
为什么Java中的泛型可以处理类而不能处理基元类型? 例如,这个操作很好: 但这是不允许的: