2

我完成了泛型的学习,但并不容易。不过,我确实明白了。这是我的理解。我希望您纠正我的错误并回答几个问题:)。

public class LinkedList<T> {
//class definition
}

  • 这意味着 LinkedList<> 是一个接受类对象和接口的类。
  • public class LinkedList<T extends Object> {
    //class definition
    }
    

  • 这意味着 LinkedList<> 是一个类,它只接受那些扩展 Object 类的类的对象。基本上,所有课程。如果是原始类型,T 将被 Object 替换
  • public class LinkedList<T extends Object & java.lang.Serializable> {
    //class definition
    }  
    

  • 这意味着 LinkedList<> 是一个类,它接受所有实现 Serializable 接口的类的对象。如果用户定义类的对象必须包含在列表中,则用户定义类必须实现 Serializable。
  • public class LinkedList<T> implements Iterable<T> {
    //class definition
    }  
    

  • 这意味着 LinkedList<> 类可以与基于集合的 for 循环一起使用。它必须重载 iterator() 方法,并且应该有一个实现Itarator<T>和重载 hasNext()、next() 和 remove() 的内部类

  • 问题
    1. 如果可能的话,请用简单的语言和例子来解释这个的含义:
    public classBinaryTree<T extends Comparable<? super T>> 用什么代替?2. 我想使用 writeObject() 方法将上面提到的 LinkedList<> 类写入文件。所以我将其声明为

    public class LinkedList<T extends Object> implements Serializable {
         //methods and data members      
    private class Node implements Serializable { //inner class
                      T object;
                      Node next;
               }
        }
    

    内部类是否也必须实现 Serializable ?

    4

    3 回答 3

    2

    关于您的前四点:

    1. 应该包含T(包括扩展的类T)的实例的列表。
    2. 实际上与第一个相同,因为所有类都扩展了Object.
    3. 一个列表,只能包含Serializable(相同class LinkedList<T extends Serializable> { ... })的对象
    4. 的可迭代列表T,所以是的,它可以用于增强循环。

    值得注意的是,当我们说“只能包含指定类型的对象的列表”时,我们应该说“应该”而不是“可以”。除非您传递Class<?>对象,否则 Java(运行时)不会检查传入的值是否实际符合,只有编译器会,并且仅基于可见的静态类型,这可能已经手动更改(这会发出警告)。

    关于问题:

    1. 它表示BinaryTree包含Comparable与属于同一类的任何对象T或其任何超类型的对象(Object是所有类的一个超类型,本质上是所有T扩展的类和它实现的所有接口)的对象。
    2. 如果您想使用 序列化对象writeObject,则该对象的所有非瞬态(即您不能基于其他数据重建)实例字段也需要Serializable,否则writeObject将忽略它们。您的代码提取不足以判断是否Node需要Serializable,但它可能需要给出List示例的一般概念。
    于 2012-06-01T15:03:09.790 回答
    1

    添加一些说明:

    T代表任何引用类型;它可以是类、接口或数组,也可以是参数化类型。类和接口等之间没有区别。

    T extends Object相同,T因为每个引用类型都是的子类型Object(是的,接口也是的子类型Object)。extends Object有点多余。

    T extends Object & Serializable需要TObject和的子类型Serializable。因为正如我们之前所说,一切都是 的子类型Object,所以现在你可以认为它与T extends Serializable(它略有不同,因为在第一种情况下擦除T将是Object,在第二种情况下Serializable;但你不需要在这一点上担心这个)。

    于 2012-06-01T18:39:21.700 回答
    0

    来自 Oracle 指南:

    注意 - 强烈建议不要对内部类(即不是静态成员类的嵌套类)(包括本地和匿名类)进行序列化,原因有几个。因为在非静态上下文中声明的内部类包含对封闭类实例的隐式非瞬态引用,所以序列化这样的内部类实例也会导致其关联的外部类实例的序列化。由 javac(或其他 JavaTM 编译器)生成的用于实现内部类的合成字段是依赖于实现的,并且可能因编译器而异;此类字段的差异可能会破坏兼容性并导致默认 serialVersionUID 值冲突。分配给本地和匿名内部类的名称也取决于实现,并且可能因编译器而异。由于内部类不能声明编译时常量字段以外的静态成员,因此它们不能使用 serialPersistentFields 机制来指定可序列化字段。最后,因为与外部实例关联的内部类没有零参数构造函数(此类内部类的构造函数隐式接受封闭实例作为前置参数),它们无法实现 Externalizable。然而,上面列出的所有问题都不适用于静态成员类。他们无法实现 Externalizable。然而,上面列出的所有问题都不适用于静态成员类。他们无法实现 Externalizable。然而,上面列出的所有问题都不适用于静态成员类。

    可序列化接口为类定义可序列化字段

    于 2012-06-01T15:04:28.340 回答