当前位置: 首页 > 面试题库 >

从通用超型扩展?

韦繁
2023-03-14
问题内容

在Java中,我可以从通用超类型进行扩展吗?根据这篇文章,看来我应该能够:http
:
//www.ibm.com/developerworks/java/library/j-djc05133.html。

public abstract class MyClass<T> extends T {

但是,当我在应用程序中执行类似操作时,出现以下错误: “无法将类型参数T引用为超类型。”

有谁知道我是否能够从Java中的泛型超型扩展?而且,如果是这样,是否需要特殊的东西来实现这一目标?

编辑:我看错了这篇文章。 它实际上是在讨论这种潜在的问题。


问题答案:

能够从具有泛型类型参数的超类型继承。例如:

public class MyList<T> extends AbstractList<T>

(或者甚至给出参数范围):

public class MyStringList extends AbstractList<String>

无法
定义具有通配符超类型的类。这样的概念在Java中没有任何意义(我不认为它在抽象中具有很大的价值)。在您的MonitoredDevice示例中,我什至不确定您在那里期望什么功能。

由于存在擦除,因此在Java工作方式的基本层面上根本不可能做到这一点。每个类都必须有一个超类-
什么是超类MonitoredDeviceMonitoredDevice对象上有哪些可用方法?您将无法在此类上调用任何继承的方法,因为编译器无法保证此类方法的存在,字节码也不能表示此类调用。

我怀疑使用动态代理可以更好地实现您要执行的操作。

编辑:好的,在阅读完全文之后,我可以看到这样的声明背后的动机是什么。但是在充分阅读本文之后,您还意识到Java目前不支持此功能。其根本原因是由于擦除;在当前的机制下,这种技术将永远不可能实现,并且本文详细介绍了阻止此功能起作用的原因。



 类似资料:
  • 问题内容: 当我以为自己终于了解了泛型时,我遇到了以下示例: 它说,如果第1行未注释,则不会编译以下内容: 如果注释了第2行,则不会编译以下内容: 在第二个示例中,允许使用脂肪族及其超类型。那么为什么不允许脂肪族? 在第一个示例中,为什么不允许? 第一个编译器错误: 第二编译器错误: 问题答案: 您的第一个声明 表示 可能 是一个(因为extends ,extends 和extended )。 在

  • 问题内容: 说我有一个像这样的父接口/类 还有许多实现通用类型的实现接口。 我可以使用反射来获取的情况下代表我有没有为对象。像这样: 目前,我已经作为参数传递了,但是如果可以的话,我想简化一些事情。 问题答案: 是的,尽管什么其他人说,这个信息 是 可用的,如果你有机会到子类对象。您需要与一起使用。 在您的示例中,“实际”类型参数应返回for 。

  • 问题内容: 我想为此创建一个扩展名,仅影响… 我了解这些说明是相关的,但不确定如何: 扩展通用类型时,不提供类型参数列表作为扩展定义的一部分。而是在扩展程序的正文中提供原始类型定义的类型参数列表,并且原始类型参数名称用于引用原始定义的类型参数。 基本上,我正在尝试使用此方法: 在没有参数的情况下采取行动…这可能吗? 问题答案: Swift 3.1更新 从Swift 3.1(Xcode 8.3 be

  • 问题内容: Java是否可以让类扩展泛型,以便您可以将方法注入通过代码传递的任何类中?(或者是否有其他方法可以使用Java将方法注入或重写到现有类中?) 我所说的“扩展通用类型”是这样的(类“ Textended GameObject”属于游戏,可能不会更改,并且是未知的,因为它是在运行时(从其他mods)加载到游戏中的): onTick由GameEngine调用,通过这种方式,我可以将每个现有的

  • 考虑以下TS定义: 没什么问题,但我想知道是否有一个等效?显然,可以将泛型传递到接口中,尽管这不是我想要的,例如: 这里的示例是在React代码的上下文中,但潜在的问题是基本的TS。

  • 在这个问题中,我看到我可以使用帮助方法将通配符泛型“捕获”到类型T中以执行类型安全操作,如下所示: 但是当我尝试使用关键字执行此操作时,它不起作用: 我得到以下错误: 当使用扩展关键字时,有没有办法捕获通配符? 我的背景是,我有一个扩展给定类a的类列表,每个类都有一个不同的泛型参数T。对于每个类,我想获得对其T类的引用,我试图安全地进行类型转换。