我有三节课:
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个编译时错误:
如果基类不是泛型的,那么我如何摆脱这些错误呢?
我的班级层次结构是:
class fileHandler<Key, Value> { }
class A extends fileHandler<String, String[]> { }
class B extends fileHandler<String, String> { }
gen(object of A)
或gen(object of B)
。现在,我应该如何在C和D以及E中定义这些功能:
我给出了以下内容:
public abstract void gen (fileHandler A) throws exception;
void gen (fileHandler A) throws exception;
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服务。我已经看过很多版本如何实现这一点,并决定这样做。我完全愿意接受建议,但是,学习如何解决这个问题,将有助于我的编码实践,至少我认为会。此外,我知道我的命名约定可能会被取消,所以我也愿意接受这样的更正:) 这是我的代码: 最终,我希望有一个学
我有一个典型的问题,什么是更好的,我认为答案总是视情况而定,但我还是想澄清一下。所以有两种方法: 逻辑是: 我知道由于类型擦除,方法签名存在冲突,所以我的问题不是“为什么我不能同时拥有这两个方法?”,而是“你会选择哪种方法?”。