将字符串理解为类型参数

时间:2019-09-30 14:57:12

标签: java

我不理解为什么可以使用PPrinter类的String类型参数创建整数类型的以下obj,尽管该代码可以编译并成功运行。请帮忙!

class PPrinter<String> {

    private String t;

    PPrinter(String t){
        this.t = t;
    }

    String getT(){
        return this.t;
    }
}

public class Test {

    public static void main(String[] args) {

        PPrinter<Integer> obj = new PPrinter<>(100);
        System.out.println(obj.getT());

    }
}

1 个答案:

答案 0 :(得分:0)

您的代码具有名为“ String”的通用类型-它是有效的,但令人困惑。

来自Generic Types中的“类型参数命名约定” (我的重点在下面添加):

  

按照惯例,类型参数名称为单个大写字母。这与您已经知道的变量命名约定形成鲜明对比,并且有充分的理由:没有这种约定,将很难分辨类型变量与普通类或接口名称之间的区别。

也来自同一参考文献:

The most commonly used type parameter names are:
E - Element (used extensively by the Java Collections Framework)
K - Key
N - Number
T - Type
V - Value
S,U,V etc. - 2nd, 3rd, 4th types

遵循这些约定,您的PPrinter类将如下所示:

class PPrinter<T> {
    private T t;

    PPrinter(T t) {
        this.t = t;
    }

    T getT() {
        return this.t;
    }
}

您仍然可以像您的代码一样使用任何类型(IntegerStringBoolean等)来调用它,但是不会混淆您的原始问题

PPrinter<Integer> obj1 = new PPrinter<>(100);
PPrinter<String> obj2 = new PPrinter<>("foo");
PPrinter<Boolean> obj3 = new PPrinter<>(false);