泛型类的可见性由其自身访问修饰符决定,与泛型参数无关;public修饰时全包可见,无修饰符时仅本包可见,private/protected不可用于顶层泛型类。

泛型类本身的可见性,由其类声明的访问修饰符决定,和泛型参数类型无关。换句话说:**限制泛型类在不同包下的可见性,靠的是类的访问修饰符(public / 默认),而不是泛型本身**。
泛型类的可见性只取决于类修饰符
Java 中泛型是编译期机制,运行时会被擦除。泛型参数(如 T、List<e></e>)不改变类的访问权限边界。真正起作用的是这个泛型类自己被声明成什么级别:
-
public class Box
:该类可在任意包中被 import 和使用(前提是类可加载) -
class Box
(无修饰符):仅本包内可见,其他包哪怕继承或反射也无法直接引用该类名 - private / protected 不能用于顶层泛型类(编译报错),只可用于内部类
跨包使用泛型类时的常见限制场景
即使泛型类是 public,它的成员(字段、方法)仍受各自访问修饰符约束。例如:
- 一个
public class Result<t></t>,如果其内部字段是protected T data,那么跨包子类可继承并访问this.data,但外部包代码不能通过result.data访问 - 若字段是
T data(默认修饰符),则只有同包类能读写,跨包子类也看不到它——即使泛型类本身是 public - 构造器用
protected Result(),意味着只能被同包子类或跨包子类调用,不能被外部包普通代码 new 出来
如何实现“仅限同包使用泛型工具类”
这是最典型的包级封装需求。做法很简单:
- 泛型类不加
public,即class StringUtils<t> { ... }</t> - 确保所有使用它的类(包括测试类)和它在同一个 package 下
- 如果需要对外提供能力,暴露
public static <t> String format(T obj)</t>这样的静态方法,方法本身 public,但底层泛型类保持包私有 - Maven 多模块中注意:
src/test/java默认不算同包,需显式配置或改用protected+ 同包测试结构
不要混淆:泛型类型参数 ≠ 可见性控制点
你不能靠 <t extends packageprivateclass></t> 来限制泛型类的使用范围。因为:
- 只要
PackagePrivateClass在当前编译单元不可见,整个泛型声明就会编译失败 - 泛型边界(
extends/super)只做类型检查,不参与访问控制决策 - 真正拦住跨包使用的,永远是类、构造器、方法这些实体自身的修饰符
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











