Java中的<E>语法是什么意思?

57

我已经快速谷歌搜索了答案,但是找不到/想到准确的搜索参数。

我正在自学Java,但是似乎找不到某种语法的含义。

public class Node<E>{
    E elem;
    Node<E> next, previous;
}

<E>是什么意思?我模糊地记得箭头括号与向量有关,但根据上面的代码,我感觉它与枚举有关。

任何帮助或澄清都将不胜感激。谢谢。


12
谷歌搜索“泛型”。 - Dennis Meng
你的问题标题并没有明确表明它是关于什么的。请考虑重新命名,例如:“Java中的<E>语法是什么意思?” - joeytwiddle
你是正确的,我该如何更改标题?我没有立即看到可以这样做的选项。 - d.lanza38
我认为标题已经很好了,“语法”一词并没有什么意义。如果你想要更改,也许可以改成“Java中Node<E>中的<E>是什么意思”。@d.lanza38 点击编辑(在标签下方,在分享标记之间)。 - ataulm
3个回答

62

这些被称为泛型

一般来说,在定义类、接口和方法时,它们使得类型(类和接口)可以作为参数。

与非泛型代码相比,使用泛型能够带来许多好处,正如Java教程中所示:

  • 编译时更强的类型检查。 Java编译器对泛型代码应用强类型检查,如果代码违反了类型安全性,则会发出错误。修复编译时错误比修复运行时错误更容易,而后者可能很难找到。

    例如:

    // without Generics
    List list = new ArrayList();
    list.add("hello");
    
    // With Generics
    List<Integer> list = new ArrayList<Integer>();
    list.add("hello"); // will not compile
    
  • 让程序员能够实现通用算法。 通过使用泛型,程序员可以实现适用于不同类型集合的通用算法,可以进行定制,并且类型安全并且更易于阅读。

  • 消除类型转换。

    例如,以下没有使用泛型的代码片段需要强制类型转换:

    List list = new ArrayList();
    list.add("hello");
    String s = (String) list.get(0);
    

    当重写代码使用泛型时,代码不需要转换类型:

    List<String> list = new ArrayList<String>();
    list.add("hello");
    String s = list.get(0); // no cast
    

27

这里<E>代表Node类的类型参数。类型参数定义了它可以引用任何类型(如String,Integer,Employee等)。Java泛型有以下类型参数命名约定:

  1. T - 类型
  2. E - 元素
  3. K - 键

  4. N - 数字

  5. V - 值

例如,考虑以下场景

public class Node<E>{
   E elem;
   Node<E> next, previous;
}
class Test{
   Node<String> obj = new Node<>();
}

对于上述情况,在后台,Node 类 'E' 将引用 String 类型,并且该类将如下所示:

public class Node<String>{
   String elem;
   Node<String> next,previous;
}

除了String外,您还可以使用Integer、Character、Employee等作为类型参数。

您还可以在接口、方法和构造函数中使用泛型。

有关泛型的更多信息,请访问以下网址:

https://www.journaldev.com/1663/java-generics-example-method-class-interface https://www.javatpoint.com/generics-in-java


1

泛型是Java语法中指示通用类型的方式。基本上,这意味着它可以是一个Node对象,可以采用任何类型。

您应该查看this,了解有关Java泛型的良好教程。


1
措辞不明确 - “take on” 是什么意思? - SimonT

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接