CodeGym /Java 课程 /Java 语法 /泛型是什么?

泛型是什么?

Java 语法
第 7 级 , 课程 7
可用

“又是一个很酷的主题。”

“惊喜不断降临!今天是我的生日吗?”

“今天,我要给你介绍泛型。泛型是带有参数的类型。在 Java 中,容器类允许你指出其内部对象的类型。”

“声明泛型变量时,我们指出两个(而不是一个)类型:变量类型和它所存储的数据的类型。”

“ArrayList 是一个很好的示例。创建新的 ArrayList 对象时,可以方便地指出将在此列表内存储的值的类型。”

代码 说明
ArrayList<String> list = new ArrayList<String>();
创建名为 list 的 ArrayList 变量。
将 ArrayList 对象分配给该变量。
此列表只能存储 String 对象。
ArrayList list = new ArrayList();
创建名为 list 的 ArrayList 变量。
将 ArrayList 对象分配给该变量。此列表可以存储任意值
ArrayList<Integer> list = new ArrayList<Integer>();
创建名为 list 的 ArrayList 变量。
将 ArrayList 对象分配给该变量。
此列表只能存储 Integerint 值。

“听起来超级有趣。尤其是有关存储任意类型的值这一部分。”

“只是看起来不错。实际上,如果我们在一种方法中将字符串放入 ArrayList,然后在另一种方法中希望它包含数字,那么程序将会崩溃(以错误终止)。”

“我明白了。”

“现在,我们不会创建我们自己的带类型参数的类。我们只使用现有的类。”

“任何类都可以作为类型参数,甚至是我编写的类?”

“是的。除原始类型外的任何类型。所有类型参数都必须从 Object 类继承。”

你的意思是,我不能编写 ArrayList<int>?

“你确实不能编写。但是 Java 开发人员为每种原始类型编写了包装类。这些类继承 Object。看起来如下所示:”

原始类型 列表
int Integer ArrayList<Integer>
double Double ArrayList<Double>
boolean Boolean ArrayList<Boolean>
char Character ArrayList<Character>
byte Byte ArrayList<Byte>

“你可以轻松地把原始类和与其相似的类(包装类)分配给彼此:”

示例
int a = 5;
Integer b = a;
int c = b;

Character c = 'c';  //文字 c 是 char 类型
char d = c;
Byte b = (byte) 77;  // 文字 77 是 int 类型
Boolean isOk = true;  // 文字 true 是 boolean 类型
Double d = 1.0d;  // 文字 1.0d 是 double 类型

“很棒。我想我将尝试更多地使用 ArrayList。”

评论 (15)
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION
z18335776829 级别 19,China,China
8 五月 2023
我们可以使用泛型 来让我的类、方法、以及接口 不局限于单一数据类型的操作, 可以根据具体需求操作不同数据类型 下面是一些常见的示例,演示了在哪些情况下可以使用类型参数 <T>: 泛型类 我们通常将泛型类定义为以下格式:

public class MyClass<T> {
    // ...
}
这允许我们在创建 MyClass 对象时指定一个类型参数,例如:

MyClass<Integer> obj = new MyClass<>();
也可以创建一个 MyClass 对象,同时依旧保留有类型参数的灵活性。即:

MyClass<?> obj = new MyClass<>();
这种方式能够让我们传递任意类型的数据给对象,并且不会限制参数的值范围和类型。 泛型方法 Java 也支持定义泛型方法,语法如下:

public <T> void myMethod(T obj) {
    // ...
}
其中 <T> 是类型参数,用来表示后面的方法参数的具体类型。这个方法可以接受任何类型的参数,编译器会在编译期间自动识别出传入参数的实际类型。 接口和可继承性 泛型接口也是非常常见的。我们可以将类型参数应用于接口中的方法签名。例如:

public interface MyInterface<T> {
    T doSomething(T param);
}

// 实现 MyInterface 接口

public class MyImpl implements MyInterface<String> {
    @Override
    public String doSomething(String param) {
        return param;
    }
}
这里,在定义 MyInterface 时,我们指定了一个类型参数 T,然后在其方法签名中使用了该类型参数。当实现该接口时,需要将类型参数具体化,即传入实际类型,例如上述代码中的 String 类型。 通过泛型接口,我们可以方便地与不同类型的数据交互,并且可以使实现类保留灵活性。 泛型限制 Java 还支持对泛型参数进行限制,以确保类型安全性。如下所示:

public class MyClass<T extends Comparable<T>> {
    // ...
}
在这个例子中,类型参数 T 被限制为只能是实现了 Comparable 接口的类类型。这样做可以在编译期间捕获类型错误,避免运行时错误的发生。 总之,通过在泛型代码中使用类型参数 <T>,我们可以使代码更加灵活、复用和易于维护。这使得 Java 的泛型成为一种非常强大的语言特性,能够满足各种复杂的开发需求。 这里的T可以替换, 甚至 可以使用 26个字母来代表有26个不一样的变量类型。 另外需要注意的是,虽然我们可以在Java程序中定义任意数量的类型参数,但过多的类型参数可能会导致代码难以阅读和维护,因此需要根据实际情况合理使用。 我们可以使用所有 Unicode 字符(甚至是中文 当然前提是你能承受同事的怒火)或任何单词来替换这里的T ,只要能够清晰体现出类型参数的含义即可。 因此,在理论上我们可以使用26个字母和其他单词或符号来表示无数多个泛型类型。 虽然 Java 编码规范建议在泛型中使用一些特定的标记符,但这并不是强制要求,开发者可以按照自己的需求、开发场景和代码风格选择适合的命名方式。
东南天 级别 9,Fuzhou,China
11 一月 2023
“很棒。我想我将尝试更多地使用 ArrayList。”
元. 级别 26,Taipei,Taiwan, Province of China
3 一月 2023
“很棒。我想我将尝试更多地使用 ArrayList。”
canghailongheng 级别 12,Los Angeles,United States
24 十一月 2022
ArrayList比array灵活好用的多。
23 八月 2022
8/23
Ocean 级别 22,China,Hong Kong
27 七月 2022
cool!
Bob 级别 20,伯明翰,美国
30 六月 2022
int和Integer有什么区别可以详细讲一下吗?
23 八月 2022
int 是8大原始变量之一,不是类,小写开头 Integer 是类,大写开头,拥有类的特点
KAI 级别 22,Wenzhou,China
15 三月 2023
int是基础类型 Integer是对应的引用类型
@ 级别 8,Wuhan,China
19 六月 2022
“很棒。我想我将尝试更多地使用 ArrayList。”
19 三月 2022
“很棒。我想我将尝试更多地使用 ArrayList。”
To be brave #10900452 级别 14,Пекин,China
4 一月 2022
“很棒。我想我将尝试更多地使用 ArrayList。”