为什么在泛型类(Java)的构造函数中提供类型参数是错误的?

时间:2015-08-31 05:21:25

标签: java oop generics syntax constructor

我只是从教科书中学习Java中的泛型,它讲的是用ng-options="data.id as data.title for data in {{$column.data}}"实现的类GenericStack<E>

因为要创建一堆字符串,所以使用

ArrayList<E>

GenericStack<String> = new GenericStack<String>()
因此,不应该是构造函数 GenericStack<String> new GenericStack<>() 被定义为GenericStackpublic GenericStack<E>()?答案是不。它应该定义为public GenericStack<>()

这是为什么?显然,构造函数可以很容易地从类声明中推断出类型,但考虑到Java的冗长,我有点迷惑为什么public GenericStack()或简单地<E>形式主义完全摆脱了这里。

3 个答案:

答案 0 :(得分:7)

这有两个部分:

  1. 类定义的泛型类型参数在类本身中可用。

  2. 您可以拥有特定于各个方法的通用类型(包括构造函数)。

  3. 请看以下示例:

    package snippet;
    
    import java.util.ArrayList;
    
    public class Y<E> extends ArrayList<E> {
    
        public <T> Y(T t) {
        }
    }
    

    如果类E可用于整个类,则类型T仅在构造函数中有效。

答案 1 :(得分:1)

您将方法的声明与其调用站点(即您使用它的位置)混淆。如果您想使用在课堂上声明的通用,只需在呼叫站点提供<E><> - 而不是声明。在这方面,构造函数与任何其他方法一样被声明:

public GenericStack<E> {
    public E get() { ...            // correct
    public <E> put(E element) { ... // bad (see below)
    public GenericStack() { ...     // correct, like the get()

重新声明通用(如上面的put情况)实际阴影它; E中的put(E)实际上与E中的GenericStack<E>不同,尽管名称相同。这很令人困惑,你应该避免这样做。

答案 2 :(得分:1)

类和构造函数都可以是通用的,即每个类都有自己的类型参数。例如

new <String>A<Integer>("abc");  // T=Integer, S=String

使用所有显式类型参数调用构造函数

A<Integer>

可以这样想,<String>A是具体的类,new A<Integer>("abc"); // S=String is inferred 是具体的构造函数。

由于类型推断,我们可以省略构造函数的类型参数

<>

该类的类型参数也可以通过&#34; diamond&#34;来省略和推断。 (A<Integer> a = new A<>("abc"); // T=Integer is inferred, as well as S=String )语法

setEnabled(boolean value)

我写了一篇关于这个主题的(长篇)帖子 - https://stackoverflow.com/a/32292707/2158288