我想编写一个快速而又脏的帮助程序类,可以快速保存我的对象。因此我正在使用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);
?
答案 0 :(得分:3)
这是一个奇怪但有趣的问题!给出一个确切而详尽的答案是很棘手的。可能有很多不同的原因,但我认为以下是最重要的原因:
编译器只会生成save
的一个版本。要使class wrap extends T
工作,参数T
必须是不同的具体类对于save
使用不同类型的每次使用,但这不是泛型的工作方式。 save
只编译一次,save
T
内部是类型参数,而不是具体类型。 (这与某种类型有关,但与类型擦除有所不同,见下文。)
另一个原因是type erasure。 Java中的泛型类型仅存在于编译时。另一方面,Java中的类具有运行时表示(与例如C ++相反)。因此,不可能从泛型类型的仅编译时构造生成类的运行时表示。
答案 1 :(得分:2)
<T>
是泛型类型,而不是真正的类。泛型类型是编译时概念,它在运行时被擦除,而类是运行时的东西,它确实有相应的字节码。您不能声明泛型类型<T>
的子类,因为编译器不知道超类是什么
答案 2 :(得分:1)
因为T可能是最终的。最后的课程不能延长。
至少这是禁止扩展泛型类型的逻辑原因。其他答案解释了技术背景。