Tag: generics

generics类类型中的参数化方法

我有一个相当简单的问题。 我找不到答案。 这两个代码片段有区别吗? 有什么区别? 片段1: public class BinaryTree<T extends Comparable> { … public void add(E value) { … } public void add(E value, Node node) { … } … } Fragment2: public class BinaryTree<T extends Comparable> { … public void add(T value) { … } public void add(T value, Node node) { … } … […]

使类通用的重点是什么?

当你有一个方法时,我明白将它声明为通用是有意义的,这样我就可以使用generics参数。 喜欢这个: public void function(T element) { // Some code… } 但是如果我可以简单地声明每个方法都是通用的,那么究竟是什么让整个类成为通用的呢?

通用限制地狱:绑定不匹配

我正在开发一个具有广泛的genericsinheritance和依赖树的项目。 转到编辑以查看更好的示例。 基础知识看起来像这样: class A { … } class B { … } class C extends B { … } class D extends A { … } class StringMap { HashMap _elements; … } 所以现在我要编写一个包含特定StringMap类型的类。 class X { StringMap<D> _thing = new StringMap<D>; … } 到目前为止,一切正常。 D实际上是一个非常长的名称,并且特定组合将在代码的其他部分中非常频繁地出现,因此我决定使用特定组合的类,以便更清楚并且具有更短的名称。 class DC extends D { } //and go […]

名称冲突:类型为test2的方法add(Object)与类型为HashSet 的add(E)具有相同的擦除,但不会覆盖它

import java.util。*; class A extends HashSet { public boolean add(Object obj){ //compiler error return true; } } or class Abc { public void add(T t){} //compiler error public void add(Object i){} //compiler error (can’t overload?) } 错误:名称冲突:类型为test2的方法add(Object)具有与HashSet类型的add(E)相同的擦除但不覆盖它 我不知道上面背后的概念是什么错误可以任何人建议我可以在哪里研究这个概念?

在Java中,在generics类型的实例上调用getClass时如何避免原始类型?

假设我在Java中有这个: List list = new ArrayList(); list.getClass(); 最后一个表达式的类型是Class Class 。 我理解为什么,由于擦除,它不能是Class<? extends List> Class<? extends List> 。 但为什么不能成为Class<? extends List> Class<? extends List> ? 如果我想将这个表达式的结果分配给一个变量,以某种方式保存这个类实际上是某种List的信息,我是否有办法避免未经检查的强制转换警告和原始类型警告 ? Class listClass = list.getClass(); // raw type warning Class<? extends List> listClass = (Class<? extends List>) list.getClass(); // unchecked cast warning

Java Generics:通用映射(深层副本)的方法签名

我有一些Map ,它们本身可能再次包含Map (任何类型)。 我用签名写了一个方法: public static HashMap deepCopyHashMap(HashMap s); 但是,我现在想要概括这个代码以支持Map ,但仍然返回与参数类型相同的对象。 所以代替: public static HashMap deepCopyHashMap(HashMap s); public static CheckedMap deepCopyCheckedMap(CheckedMap s); public static TreeMap deepCopyTreeMap(TreeMap s); … etc. 我想要这样的东西: public static <K,V, M extends Map> M deepCopyMap(M s); 但是,这给了我: Multiple markers at this line – The type M is not generic; it cannot be […]

Java编译器如何为较低边界的通配符执行类型擦除?

在使用generics类型编译源代码时,Java编译器会自动执行类型擦除,用适当的原始类型替换generics声明。 根据Oracle文档,这个擦除取代了上面的绑定通配符 使用T 。这非常适合动态多态。 但是对于有界较小的通配符如何执行此擦除 看到每个类都有一个共同的超类(Object),使用它会破坏整个目的吗?

List和List 之间的Java差异

java中的List和List什么区别?

用于上限和下限通配符的Javagenerics

我正在阅读javagenerics,我遇到了一个有趣的查询。 我的问题如下。 对于上限有界的通配符 public static void printList(List list) { for (int i = 0; i < 10; i++) { list.add(i);// gives compilation error } } 对于较低的有界通配符 public static void printList(List list) { for (int i = 0; i < 10; i++) { list.add(i);// successfully compiles } } 我对此感到困惑,因为查看Sun Oracle文档,我理解代码也应该为第1点编译 上限通配符 下界通配符 有人可以帮我理解这个吗?

这个类声明在Java中意味着什么?

我只是学习树和一件我不明白的事情是类声明: 例如:class BinarySearchTree<T extends Comparable> BinarySearchTree<T extends Comparable> 。 现在,请您解释一下括号中的内容和“ ”? 你能引用我的任何好消息来源吗? 谢谢。