9

使用 Java:我不想浪费人们的时间并在这里发布,但是我的谷歌搜索技能让我失望了,我找不到答案。我正在查看一些提供的代码,他们使用

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

(作为参考,我们正在从红黑树转换为二四树)。当我第一次处理这个问题时,我会使用而不是甚至不包含在public static void. 但是我遇到了<E>问题,尽管使用<Integer>而不是<E>其他任何地方,都解决了我所有的问题。

<E>所以我的问题是,有人可以向我解释一下

public static <E> void
4

3 回答 3

3

这是一个称为泛型的 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.
于 2012-10-31T16:00:39.513 回答
0

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

例如,如果您只想接受TwoFourTree包含 type 对象的 s List,您可以将方法定义为

public static <E extends List> void ...

如果您只想要Number对象(IntegerDouble),您会这样做

public static <E extends Number> void ...

这就是为什么创建这样的方法实际上是有用的原因。我应该指出,乐趣不止于此,您可以使用多个类型参数来做同样的事情,例如:

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

如果您想了解更多信息,我认为您可能会发现阅读本关于泛型方法的教程很有帮助。

于 2012-10-31T15:56:51.987 回答
0

而不是写

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

...

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

public static <E> 
于 2012-10-31T16:00:19.443 回答