首页 > 解决方案 > 将字符串理解为类型参数

问题描述

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

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());

    }
}

标签: java

解决方案


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

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

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

同样来自同一参考:

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;
    }
}

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

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

推荐阅读