5

我知道如果您想要一个列表(例如),您可以像这样创建它:

List<String>

如果你想创建一个通用类型的列表,你可以这样做:

MyList<T>

那么 <> 所做的唯一事情就是将对象与容器或列表耦合起来吗?它还有其他用途吗?它实际上是做什么的?在另一篇文章中阅读如何将静态方法放入泛型类型对类型安全来说是一件坏事,那么这是糟糕的代码吗?

public class LinkList<T> {

private final T t;
private final LinkList<T> next;

public LinkList(T t, LinkList<T> next){
    this.t = t;

    this.next = next;
}
// Creates list from array of T
public static <T> LinkList<T> getList(T[] t){
    if(t == null){
        return null;
    }
    LinkList linkList = null;
    for(int i = t.length-1; i >= 0; i--){
        linkList = new LinkList(t[i], linkList);
    }
    return linkList;
}

public T element() {
    return t;
}

public LinkList<T> getNext() {
    return next;
}

}

4

4 回答 4

10

<>帮助编译器验证类型安全。

编译器确保在编译时而不是运行时List<MyObj>保存类型的对象。MyObj

泛型主要用于编译时的类型安全。由于类型擦除,编译后所有通用信息都将替换为具体类型。

于 2012-08-09T20:39:20.360 回答
6

当您在其中放入<>一个类型时,它用于将潜在的运行时异常转换为编译错误。

以这段代码为例,没有泛型

ArrayList stringList = new ArrayList();
stringList.add("string");
stringList.add(3.4);
String s = (String) stringList.get(1);

// 这将编译并产生运行时错误,将字符串比较为双倍。

如果您添加泛型,您可能会在编写时发现这些错误。

考虑以下代码:

ArrayList<String> stringList = new ArrayList<String>(); // Since Java 7 you can write - new ArrayList<>()
stringList.add("string"); // OK
stringList.add(3.4); // Would not compile!

通过这种方式,您可以在编译时捕获与类型相关的错误。

编译器本身并不关心您是否使用了泛型。它会在编译时删除所有这些,并且就像您没有使用泛型一样。但是,如果您首先遇到编译错误,它不会让您编译。

我还注意到我没有回答您关于代码的问题。

当你做这样的事情

class LinkedList<T> {
....
.... 
}

你告诉编译器这个类支持泛型,在这种情况下可以做我上面所说的

你可以做

LinkedList<String> list = new LinkedList<String>();

现在,在你的课堂上,无论在哪里,T它都会像在说 一样String,因此只允许添加和维护字符串。

于 2012-08-09T20:44:37.247 回答
1

<>用于一个很酷的功能,称为泛型

在 Java 5 之前,不存在泛型。ArrayList像返回和操纵这样的集合Objects。问题在于,例如,当您知道您只会存储Strings 时。但是如果你Objects在所有的类中都使用,你不仅要使用烦人的强制转换(String blah = (String) list.get(9);),而且如果你犯了一个错误并把一个Integer放在你的列表中,你的程序就会ClassCastException烧毁。

Java 5 用泛型解决了这个问题,所以现在你可以说ArrayList<String>你只会String在 this 中使用 s ArrayList。但是如果你需要制作ArrayList<Supercalifragilisticexpealidocious>呢?显然,打字并不是一种愉快的体验,尤其是当你不得不打字的时候

ArrayList<Supercalifragilisticexpealidocious> supercaliList = new ArrayList<Supercalifragilisticexpealidocious>();

声明其中之一。此外,它可能会导致拼写错误,尤其是对于这种大小的类型参数;在某些时候,你一定会打错一两个字母,让你的程序cannot find symbol烧毁——或者更糟的是,默默地使用错误的类并导致逻辑错误。

Java 7 引入了纯<>语法。它被称为菱形运算符,因此您不必<>在赋值运算符的右侧重新键入类型参数(在 中的东西)。所以,

ArrayList<Supercalifragilisticexpealidocious> supercaliList = new ArrayList<Supercalifragilisticexpealidocious>();

变成

ArrayList<Supercalifragilisticexpealidocious> supercaliList = new ArrayList<>();

这意味着重新键入的时间要少得多Supercalifragilisticexpealidocious

希望这可以帮助!

于 2013-03-15T00:05:13.610 回答
0

<> 可以与您希望的任何类一起使用,而不仅仅是容器。这些只是最常见的,因为我们希望能够在容器中存储我们想要的任何类型的对象,并且仍然保持类型安全。要更深入地理解这一点,您应该研究泛型及其用途。

于 2012-08-09T20:42:35.777 回答