【问题标题】:What is the point of making a class generic?使类泛型有什么意义?
【发布时间】:2013-02-22 11:10:40
【问题描述】:

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

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

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

【问题讨论】:

  • 所以你可以在泛型类型的类中拥有变量?
  • 一个方法是一个成员,它可以是通用的,而不会使整个类通用。我唯一能想到的另一件事是能够使实例变量通用
  • 我认为这不应该在没有解释的情况下被否决。虽然我们大多数使用 Java 一段时间的人可能认为这很明显,但也有一些人刚刚开始学习,我认为这是一个有效的问题。
  • 其实上面那个函数可以等价写成public void function(Object element)。泛型没用

标签: java class generics


【解决方案1】:

好吧,不同之处在于,如果您尝试将类中的每个方法都设为泛型,那么您在说 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

中的类

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      这通常用于“容器”类。如果您正在构建一个 List 并使其具有通用性,那么您希望确保添加元素​​、获取元素、迭代等...始终使用相同的类型。

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

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

      【讨论】:

        【解决方案4】:

        主要思想是为一个类型绑定类/方法。最好的例子是编程语言中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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-01-07
          • 1970-01-01
          • 2020-09-10
          相关资源
          最近更新 更多