从头认识java-13.10 边界的作用

本文详细介绍了Java泛型中的边界概念及其使用方法。通过具体示例展示了如何利用泛型边界进行类型检查,确保代码的健壮性和灵活性。此外,还探讨了多重边界的应用场景。

这一章节我们来讲述一下边界。

之前的章节已经提到,在jvm层面,泛型的类型信息会被擦除,但是,为了可以在编译器能够更好的进行类型检测,我们引入了边界。

例子

package com.ray.ch11;

public class Test<T> {

	@SuppressWarnings({ "unchecked", "rawtypes" })
	public static void main(String[] args) {
		new SwimAndRunObject(new Person());
		// new SwimAndRunObject(new Object());//error

	}
}

interface canRun {
}

class RunObject<T extends canRun> {
}

abstract class canSwim {
}

class SwimAndRunObject<T extends canSwim & canRun> {
	public SwimAndRunObject(T item) {
	}
}

class Person extends canSwim implements canRun {
}

我们仔细观察上面的代码,需要注意的地方有两个:

(1)在main方法里面SwimAndRunObject构造函数只接受canRun或者canSwim这两种类型的对象。由于我们在SwimAndRunObject里面已经给泛型限定了边界,在编译的时候,编译器会进行类型检测,符合的才能够便已通过,因此下面的那个new Object则不行。

(2)边界的定义通过extends标记,而且在多重边界的时候,可以通过“&”来连接。


下面我们修改一下上面的代码,在增加一个live的类,然后其他的类都继承这个live类,而且live类引入泛型T。

package com.ray.ch11;

public class Test<T> {

	@SuppressWarnings({ "unchecked", "rawtypes" })
	public static void main(String[] args) {
		new SwimAndRunObject(new Person());
		// new SwimAndRunObject(new Object());//error

	}
}

class Live<T> {
}

interface canRun {
}

class RunObject<T extends canRun> extends Live<T> {
}

abstract class canSwim {
}

class SwimAndRunObject<T extends canSwim & canRun> extends Live<T> {
	public SwimAndRunObject(T item) {
	}
}

class Person extends canSwim implements canRun {
}

上面的代码,Live里面的T,其实已经同时加上了边界。


总结:这一章节主要讲述边界的作用。


这一章节就到这里,谢谢。

-----------------------------------

目录


你已经成功安装了 `PyQt6` 及其相关组件: ``` Successfully installed PyQt6-Qt6-6.9.2 PyQt6-sip-13.10.2 pyqt6-6.9.1 ``` 现在如果你想**完全卸载这些 PyQt6 相关包**,可以使用 `pip uninstall` 命令。 --- ### ✅ 方法一:逐个卸载(明确控制) ```bash pip uninstall pyqt6 PyQt6-Qt6 PyQt6-sip ``` 系统会提示你确认是否删除: ``` Found existing installation: pyqt6 6.9.1 Uninstalling pyqt6-6.9.1: Would remove: ... Proceed (Y/n)? Y Found existing installation: PyQt6-Qt6 6.9.2 Uninstalling PyQt6-Qt6-6.9.2: Would remove: ... Proceed (Y/n)? Y Found existing installation: PyQt6-sip 13.10.2 Uninstalling PyQt6-sip-13.10.2: Would remove: ... Proceed (Y/n)? Y ``` 输入 `Y` 确认即可。 --- ### ✅ 方法二:一行命令全部卸载(快捷) ```bash pip uninstall pyqt6 PyQt6-Qt6 PyQt6-sip -y ``` > `-y` 参数表示“自动确认 yes”,无需手动输入。 --- ### ✅ 方法三:检查是否还有残留 卸载后,检查是否已清除: ```bash pip list | findstr -i "pyqt\|PyQt" ``` 或在 PowerShell 中: ```powershell pip list | Select-String -Pattern "pyqt" -CaseSensitive:$false ``` 如果没有输出,说明已彻底卸载。 --- ### 🧼 额外清理(可选) 有时旧的 `.pyc` 缓存或 IDE 缓存可能导致导入错误。建议: 1. 删除项目目录下的 `__pycache__` 文件夹 2. 清除 Python 缓存(如果使用 PyCharm/VSCode): - 重启 IDE - 或清除缓存:`File → Invalidate Caches`(PyCharm) --- ### 🔁 如果想换为 PyQt5 卸载完成后,可安装 PyQt5 替代: ```bash pip install pyqt5 lxml ``` 然后重新编译资源文件: ```bash pyrcc5 -o libs/resources.py resources.qrc ``` 再运行 `labelImg.py` 即可。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值