关于public static <E> void中的<E>的Java

使用Java:我不想浪费人们的时间并在这里发布,但是我的谷歌搜索技巧已经失败了,我找不到答案。 我正在浏览一些提供的代码,然后使用它们

public static <E> void printTree(TwoFourTree<E> tf)

(仅供参考,我们将从红黑树转换为双四树)。 当我第一次接触到这个问题时,我会使用而不是甚至包括在public static void的初始方法声明中。 然而,我遇到了问题,抛出这个<E>解决了我所有的问题,尽管在其他地方使用<Integer>而不是<E>

所以我的问题是,有人可以向我解释<E>究竟做了什么

public static <E> void

这是一种称为泛型的Java特性。

你为什么要使用泛型? 那么,以下给出了一个他们有用的场景。 回到“糟糕的旧时代”,如果你想要一个可以与任何对象一起工作的类,你必须声明所有对象的接口,例如

public class MySuperList
{
    public void Add(object a) { }
}

然而,这很糟糕,因为你没有类型安全 - 你可以编写如下的代码:

// Your code
MySuperList list = new MySuperList();
cars.Add(new Car("Ford Mondeo"));// Works
cars.Add(new Fish("Herring")); // Works - which is a shame as a Fish is not a car!

泛型修复了这个问题,允许你强类型化你的类,但以一种通用的方式。 例如:

public class MySuperList<T>
{
    // Add method will only accept instances of type T.
    public void Add(T a) { }
}

// Your code
MySuperList<Cars> list = new MySuperList<Cars>();
cars.Add(new Car("Ford Mondeo"));// Works
cars.Add(new Fish("Herring")); // Compile-time error.

而不是写作

public static Integer ...
public static Double ...
public static Long ...

...

你所做的只是创建泛型方法

public static <E> 

它创建了一个通用的方法; 即它允许你使用一个持有任何类型的对象作为你的参数的TwoFourTree (在这种情况下)。

例如,如果您只想接受持有List类型对象的TwoFourTree ,则可以将该方法定义为

public static <E extends List> void ...

如果你只需要Number对象( IntegerDouble等),你会这样做

public static <E extends Number> void ...

这是创建这种方法实际上可能有用的原因。 我应该指出,有趣的事情并没有结束,你可以使用多个类型参数来做同样的事情,例如:

public static <T, S extends Number> void ...

如果您想了解更多信息,我想您可能会发现阅读本教程中有关泛型方法的好处。

链接地址: http://www.djcxy.com/p/11381.html

上一篇: Java regarding <E> in public static <E> void

下一篇: How to change the concurrent build path separator in Jenkins