泛型如何在这种情况下起作用?

时间:2014-10-18 15:31:26

标签: java generics

generics处查看泛型并得到此问题

public class Box<T> {
    // T stands for "Type"
    private T t;

    public void set(T t) { this.t = t; }
    public T get() { return t; }
}

如果我想让盒子只保留整数,我可以像下面一样启动。这里有道理。

 Box<Integer> integerBox = new Box<Integer>();

案例2: - 但在各个地方,我看到了以下模式

public class Box<Integer> {
    private Integer var;

    public void set(Integer var) { this.var = var; }
    public Integer get() { return var; }

}

实例化的方式是相同的,即

   Box<Integer> integerBox = new Box<Integer>();

但是,如果我们不使用它,那么用整数实例化有什么用呢?

在第二种情况下,我没有得到通用说明符和类声明的好处吗?

我的意思是如果我在第二种情况下宣布没有钻石操作员的类,我失去了什么好处?我确信我没有找到合适的位置。

修改: -

看起来我不清楚案例2片段。请参阅以下代码段

public class Box<Integer> {
    private String var;

    public void set(String var) { this.var = var; }
    public String get() { return var; }

}

1 个答案:

答案 0 :(得分:3)

你所看到的&#34;各个地方&#34;只是糟糕的编码。

中的Integer
public class Box<Integer>

不是java.lang.Integer类的引用,而是泛型类型变量,就像T一样。因此,它会在类定义中隐藏java.lang.Integer类型。实际上,您发布的两个片段完全相同。

如果您不相信,只需运行以下代码:

public class Demo {
    public static void main(String args[]) {
        Box<String> a = new Box<>();
        a.set("dummy");
        a.whatami();
    }
}

class Box<Integer> {
    private Integer var;

    public void whatami() {
        System.out.println(var.getClass().getName());
    }

    public void set(Integer var) { this.var = var; }
    public Integer get() { return var; }
}

输出为java.lang.String,而不是java.lang.Integer

实际上,您不需要命名泛型类型T。您可以将其称为FooBarBaz。也许避免误导名字可能是一个好主意。 也许

编辑:您的编辑完全改变了问题。在这种特定情况下,声明不使用泛型类型变量的泛型没有任何好处。由于编译时类型擦除,你都没有得到任何不满。

,它并非毫无意义。 虽然该类现在不使用类型标记,但它可能会在将来的版本中使用它。如果你达到了你需要使你的类具有通用性的一个点,那么你必须仔细阅读你所写的所有代码并用钻石符号修改它。它会花费你的时间,你可能还需要重构某些部分。