使类通用的重点是什么?

时间:2013-02-22 11:10:40

标签: java class generics

当你有一个方法时,我明白将它声明为通用是有意义的,这样我就可以使用泛型参数。像这样:

public <T> void function(T element) {
    // Some code...
}

但是,如果我可以简单地声明每个方法都是通用的,那么究竟是什么让整个类变得通用呢?

4 个答案:

答案 0 :(得分:6)

嗯,不同的是,如果你试图让你的类中的每个方法都是通用的,你在firstGenericMethod中使用的泛型类型可能是也可能不是同一类型。我的意思是。

public <T> void firstGenMethod(...){

}

public <T> void secondGenMethod(...){

}

<强>测试

  SomeClass ref = new SomeClass();
  ref.firstGenMethod("string");
  ref.secondGenMethod(123);//legal as this generic type is not related to the generic type which is used by firstGenMethod

在上述情况下,没有任何一个方法具有相同的泛型类型。这取决于你如何调用它们。如果您使该类具有通用性,则该类型将应用于该类中的所有方法。

class Test<T>{

    public void firstGenMethod(T t){

    }

    public  void secondGenMethod(T t){

    }
}

<强>测试

 Test<String> testingString = new Test<>();
   testingString.firstGenMethod("abc");
   testingString.firstGenMethod(123);// invalid as your Test class only expects String in this case

您通常会将您的类设为通用的,您希望该类的整个行为(方法)在同一类型上进行处理。最好的例子是 Java Collection Framework

中的类

答案 1 :(得分:4)

查看Collection类。以List<T>为例。如果该类未被声明为泛型,您如何确保只能将正确类的元素插入到列表中?你怎么知道在致电ArrayList.get(i)时会得到什么?

答案 2 :(得分:2)

准确地说,这个类中的所有方法都适用于某种类型。

这通常用于“容器”类。如果你正在构建一个List,并且你使它成为通用的,你想要确保添加元素​​,获取元素,迭代等等......总是使用相同的类型。

正如您所提到的,这也允许您使用某种类型的实例变量,并且有几种方法以连贯的方式使用此实例(可能返回它,影响它......)。

如果你有一个具有几种不同类型的“通用”类,它可能表明你真的在一个中写了两个通用类......(虽然这可能是合法的。)

答案 3 :(得分:1)

主要思想是为类型绑定类/方法。最好的例子是编程语言中Generics的概念。它是多态的真正应用
通用类封装了不特定于特定数据类型的操作。泛型类的最常见用途是使用链接列表,散列表,堆栈,队列,树等集合,其中无论数据类型如何,在集合中添加和删除项目等操作的执行方式大致相同。存储

对于需要收集类的大多数场景,推荐的方法是使用编程语言中提供的方法 受到oracle docs的影响 泛型类型是通过类型参数化的通用类或接口

public class Box {
    private Object object;

    public void set(Object object) { this.object = object; }
    public Object get() { return object; }
}


一般来说,你可以严格要求

public class Box<T> {
    // T stands for "Type"
    private T t;

    public void set(T t) { this.t = t; }
    public T get() { return t; }
}


我还建议你看看tutorial