为什么Java中的泛型?它与重载有何不同?

Man*_*noj 6 java generics

我想add()用Java 编写单个方法,可以添加整数,字符串等.泛型会帮助我.

我无法理解泛型的终极目标.我感到很困惑.

泛型与重载?

public Integer add(Integer i, Integer j){return i+j;}
public String add(String i, String j){return i+j;}
public <T> T add(T i, T j){return i+j;} //this gives me error.
Run Code Online (Sandbox Code Playgroud)

请让我离开它.

谢谢.

And*_*s_D 5

泛型可以提供帮助,这里的问题是+操作仅针对java原语定义,String而不是针对一般类型定义.在Java中,我们不能重载运算符(例如我们可以在C++中执行).

没有泛型的实用解决方案是:

public Integer add(Integer a, Integer b) { return a + b; }    // sum of a and b
public String add(String a, String b) { return a + b; }      // concatenate operation!
public MyType add(MyType a, MyType b) { return a.add(b); }   // requires add operation
Run Code Online (Sandbox Code Playgroud)

  • 你的第二段不是真的.返回类型不是Java中方法签名的一部分,只是名称和参数类型.只要参数不同,您就可以拥有不同的返回类型.或者我误解了你写的是什么? (2认同)

Jay*_*Jay 5

其他人指出为什么这不起作用.我想补充一点,我认为你误解了Java泛型的用途.也许您熟悉C++模板,或者使用C宏扩展,这两者都类似于泛型,但却是一个非常不同的东西.

仿制药实际上是关于类型安全和避免混乱的演员表.您告诉编译器某个集合包含字符串,然后它知道您放入或取出的所有内容都必须是字符串.你可以对你输入的内容进行一些编译时检查,并在你拿出的东西上保存一些演员表.

它不会导致编译器根据类型生成不同的代码.泛型不是一种简单的方法,可以避免编写相同函数的"int"版本和"float"版本,就像宏或C++模板一样.您可以通过使用两个实现相同功能的类来获得这种期望的不同行为,但是一个使用int而另一个使用浮点数.但是你可以使用没有泛型的面向对象技术来做到这一点.如果使用"非泛型"面向对象技术无法获得所需的独特行为,那么您也无法使用泛型.


Jig*_*shi 4

我想在 Java 中编写一个方法 add() ,它可以添加整数、字符串等。 Is Generics 会帮助我。

泛型主要在编译时用于类型安全。

您只能指定一种类型添加到集合中

List<String> lst;

仅接受 String,没有 String 的超类,也没有子类 [ 例如,如果存在 ]