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

泛型和继承问题

许高峻
2023-03-14
问题内容

我有三节课:

public abstract class fileHandler<Key extends Object, Value extends Object> {
}

public A extends fileHandler<String, String[]> {
}

public B extends fileHandler<String, String> {
}

现在在我的主要职能中,我做这样的事情:

fileHandler file= null;
If (<condition>) {
    fileHandler = new A();
} else
    fileHandler = new B():
}

但这会产生2个编译时错误:

  1. 无法将A转换为fileHandler
  2. 无法将B转换为fileHandler

如果基类不是泛型的,那么我如何摆脱这些错误呢?

更新:

我的班级层次结构是:

  1. class fileHandler<Key, Value> { }
  2. class A extends fileHandler<String, String[]> { }
  3. class B extends fileHandler<String, String> { }
  4. 调用函数的C类gen(object of A)
  5. 调用函数的D类gen(object of B)
  6. C和D都从抽象类E派生。

现在,我应该如何在C和D以及E中定义这些功能:

我给出了以下内容:

E:

public abstract void gen (fileHandler A) throws exception;

C:

void gen (fileHandler A) throws exception;

D:

void gen (fileHandler A) throws exception;

C,D和E给出错误fileHandler是原始类型。对通用类型fileHandler(Key,Value)的引用应参数化。


问题答案:

当您使用不同的类型参数实例化通用类型时,两个实例都不兼容。泛型类型的不同实例化不是类型等效的,即从另一个类继承的类与该类的类型等效,即使类型参数本身可以通过继承关联。泛型和多态是两个独立的语言功能。

您的代码等效于以下内容:

// Java defaults unspecified type arguments to Object.
fileHandler<Object, Object> file;

if (...) {
   // Error: fileHandler<String, String> is not equivalent to fileHandler<Object, Object>
   file = new fileHandler<String, String>();
} else {
   // Error: fileHandler<String, String[]> is not equivalent to fileHandler<Object, Object>
   file = new fileHandler<String, String[]>();
}

如果您确实想隔离与用于实例化fileHandler类的类型无关的多态接口,那么我建议您使用一个接口:

interface IFileHandler
{
    // If this interface needs to talk about keys and values, it
    // does so using only java.lang.Object.
}

public class fileHandler<Key extends Object, Value extends Object>
    implements IFileHandler
{
    // ...
}

public class A extends fileHandler<String, String>
{
    // ...
}

public class B extends fileHandler<String, String[]>
{
    // ...
}

IFileHandler file;

if (...) {
    file = new A();
} else {
    file = new B();
}


 类似资料:
  • 和这个问题相关的课程: 现在,这似乎已被编译器接受。不幸的是,我不知道/理解如何创建的新实例,。 当然,这确实不起作用:

  • 问题内容: 我正在编写一个流畅的API,以配置和实例化一系列“消息”对象。我有消息类型的层次结构。 为了在使用Fluent API时能够访问子类的方法,我使用了泛型来对子类进行参数化,并使所有的fluent方法(以“ with”开头)都返回泛型类型。注意,我省略了流利方法的大部分内容。其中进行了许多配置。 具体的子类类似地重新定义泛型。 该代码有效,即,我可以实例化任何类并使用所有流利的方法: 以

  • 为了在 .NET Core 中使用依赖关系注入,我们构建了一堆存储库接口,供控制器用于数据库交互。 我们有一个< code>EntityBase类,其中包含一些方法,我们的通用存储库接口使用这个基类,例如:< code>IRepository 我想添加一个更具体的 类,该类扩展了 ,以表示我们有一些要按标记筛选的实体。我希望 有一个抽象属性,我可以在控制器中使用该属性,以便我可以抽象出来并重用过滤

  • 问题内容: 我有一个(对我而言)复杂的Java泛型问题。我通读了一些文档,并了解了一些,但不是全部。基本上,对我来说,尝试解决它会导致尝试和错误。 在下文中,我给出了代码的精简示例,一次没有任何泛型(这样一个人就可以希望理解我想要实现的目标),而另一个则有一些更接近解决方案的补充。请更正我的第二个版本和/或指向特定的文档。(我有Java泛型的常规文档。但是我的代码似乎遇到了一些干扰性的挑战,因此很

  • 我发现的最接近的问题(方法链接:在多级继承的情况下如何使用getThis()技巧)并没有直接回答我的问题。我目前正在使用morphia,正在建立一个rest服务。我已经看过很多版本如何实现这一点,并决定这样做。我完全愿意接受建议,但是,学习如何解决这个问题,将有助于我的编码实践,至少我认为会。此外,我知道我的命名约定可能会被取消,所以我也愿意接受这样的更正:) 这是我的代码: 最终,我希望有一个学

  • 我有一个典型的问题,什么是更好的,我认为答案总是视情况而定,但我还是想澄清一下。所以有两种方法: 逻辑是: 我知道由于类型擦除,方法签名存在冲突,所以我的问题不是“为什么我不能同时拥有这两个方法?”,而是“你会选择哪种方法?”。