Skip to content

类型键

Terra API 的许多地方都用到了泛型与 Java 的 Class 类,用于确保反射类型处理的类型安全。通常情况下,这个方法颇有成效。

问题

如果你需要注册了 SomeObject<SomeOtherThing> 实例的注册条目怎么办?因为有类型擦除的存在,这无法直接实现。你不能直接访问不存在于运行时的 SomeObject<SomeOtherThing>.class

一种解决方案是使用 SomeObject.class,但它并非最佳选择,理由有二:

  • 它会破坏类型安全、SomeObject 不再会有泛型类型。
  • 它会覆盖某些东西,或者被尝试注册任何 SomeObject 泛型类型的东西覆盖。

解决方案

Terra 引入了一种叫做 TypeKey 的抽象类解决这个问题。所有接受 Class 实例的 API 同样接受 TypeKey

获取类型键

为了让你的类型获取 TypeKey 实例,只需创建继承了 TypeKey 的注释内部类,同时泛型类型与你的相符。在我们的 SomeObject<SomeOtherThing> 示例中,代码如下:

Java
public static final TypeKey<SomeObject<SomeOtherThing>> SOME_OBJECT_SOME_OTHER_THING_KEY = new TypeKey<>() { };

信息

注意,TypeKeystatic final 的。将键声明移动到类顶部可以减少对其的引用,并减少不必要的实例化。

从类实例获取类型键

为了进一步降低重复引用,你可以直接从 Class 实例通过 TypeKey#of(Class) 获取 TypeKey。如果你需要某个非泛型类型的 TypeKey,这会很有用。

Java
TypeKey<Something> = TypeKey.of(Something.class);

贡献者

页面历史