Java中的<>做什么?

Gen*_*Jam 4 java generics types list

我知道如果你想要一个列表(例如)你创建它像:

List<String>
Run Code Online (Sandbox Code Playgroud)

如果要创建通用类型的列表,可以这样做:

MyList<T>
Run Code Online (Sandbox Code Playgroud)

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

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;
}
Run Code Online (Sandbox Code Playgroud)

}

kos*_*osa 9

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

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

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


La *_*bla 6

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

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

ArrayList stringList = new ArrayList();
stringList.add("string");
stringList.add(3.4);
String s = (String) stringList.get(1);
Run Code Online (Sandbox Code Playgroud)

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

如果你添加泛型,你可以在编写它时发现这些错误。

考虑以下代码:

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!
Run Code Online (Sandbox Code Playgroud)

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

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

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

当你做这样的事情时

class LinkedList<T> {
....
.... 
}
Run Code Online (Sandbox Code Playgroud)

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

你可以

LinkedList<String> list = new LinkedList<String>();
Run Code Online (Sandbox Code Playgroud)

现在,无论在您的班级中的哪个地方,它都说T它的行为就像它说的一样String,因此只允许添加和维护字符串。