5

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

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

但是,如果我可以简单地将每个方法都声明为泛型,那么让整个类泛型的想法到底是什么?

4

4 回答 4

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中的类

于 2013-02-22T11:14:30.253 回答
4

看看 Collection 类。举List<T>个例子。如果该类没有被声明为泛型,你将如何确保只有正确类的元素可以插入到列表中?你怎么知道你打电话时得到了什么ArrayList.get(i)

于 2013-02-22T11:13:19.763 回答
2

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

这通常用于“容器”类。如果您正在构建一个列表,并且将其设为通用,您希望确保添加元素​​、获取元素、迭代等......始终使用相同的类型。

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

如果您有一个具有多种不同类型的“泛型”类,则可能表明您确实在一个中编写了两个泛型类......(尽管这可能是合法的事情。)

于 2013-02-22T11:15:03.383 回答
1

主要思想是为一个类型绑定类/方法。最好的例子是Generics编程语言中的概念。它是多态性的实际应用。
泛型类封装了不特定于特定数据类型的操作。泛型类最常见的用途是与链表、哈希表、堆栈、队列、树等集合一起使用,其中从集合中添加和删除项目等操作的执行方式几乎相同,无论数据类型如何存储。

对于大多数需要集合类的场景,推荐的方法是使用编程语言中提供的那些。
参考 oracle文档
泛型类型是泛型类或接口,它在类型上进行参数化

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; }
}


我也建议你看看这个教程

于 2013-02-22T11:12:47.090 回答