内联类,它扩展了一个类型参数

时间:2016-08-26 10:20:31

标签: java generics ormlite

我想编写一个快速而又脏的帮助程序类,可以快速保存我的对象。因此我正在使用OrmLite。

我不想在我的类上添加注释,所以我尝试动态添加一个包装器,没有任何字节码库。

class wrap extends T

问题是T - 为什么无法扩展 Uri myUri = new Uri("mailto:someone@example.com?Subject=Hello%20again&body=TEST"); System.Diagnostics.Process.Start(myUri.AbsoluteUri);

3 个答案:

答案 0 :(得分:3)

这是一个奇怪但有趣的问题!给出一个确切而详尽的答案是很棘手的。可能有很多不同的原因,但我认为以下是最重要的原因:

编译器只会生成save的一个版本。要使class wrap extends T工作,参数T必须是不同的具体类对于save使用不同类型的每次使用,但这不是泛型的工作方式。 save只编译一次,save T内部是类型参数,而不是具体类型。 (这与某种类型有关,但与类型擦除有所不同,见下文。)

另一个原因是type erasure。 Java中的泛型类型仅存在于编译时。另一方面,Java中的类具有运行时表示(与例如C ++相反)。因此,不可能从泛型类型的仅编译时构造生成类的运行时表示。

答案 1 :(得分:2)

<T>是泛型类型,而不是真正的类。泛型类型是编译时概念,它在运行时被擦除,而类是运行时的东西,它确实有相应的字节码。您不能声明泛型类型<T>的子类,因为编译器不知道超类是什么

答案 2 :(得分:1)

因为T可能是最终的。最后的课程不能延长。

至少这是禁止扩展泛型类型的逻辑原因。其他答案解释了技术背景。