Java 实现嵌入在接口中的类
假设我有一个接口,接口中嵌入了一个类(目的是该接口必须提供一个“类型”。该接口有一些使用该“类型”的方法。因此,在文件S.java中,我有Java 实现嵌入在接口中的类,java,interface,implementation,Java,Interface,Implementation,假设我有一个接口,接口中嵌入了一个类(目的是该接口必须提供一个“类型”。该接口有一些使用该“类型”的方法。因此,在文件S.java中,我有 public interface S { public class SType { } public abstract void f( SType a ); } 我想在文件SS.java中实现这个接口,并尝试这样做: public final class SS implements S { public clas
public interface S {
public class SType
{
}
public abstract void f( SType a );
}
我想在文件SS.java中实现这个接口,并尝试这样做:
public final class SS implements S
{
public class SType extends java.util.HashSet<Integer>
{
}
public void f( SType a )
{
// ...
}
}
公共最终类SS实现
{
公共类SType扩展了java.util.HashSet
{
}
公共空间f(SType a)
{
// ...
}
}
但是,当我尝试编译这些文件(“javac S.java SS.java”)时,我会收到一条常见的错误消息“SS不是抽象的,并且不会在S中重写抽象方法f(SType)”,这表明具体类中的“f()”不是接口中“f()”的正确实现。为什么?请尝试:
public final class SS implements S{
public class SType extends java.util.HashSet<Integer>
{
}
public void f(S.SType a) {
// ..
}
}
公共最终类SS实现{
公共类SType扩展了java.util.HashSet
{
}
公共空间f(S.SType a){
// ..
}
}
编辑:
也许,你需要这样:
public interface S<SType> {
public void f( SType a );
}
public final class SS implements S<HashSet<Integer>> {
public void f(HashSet<Integer> a ){
// ...
}
}
公共接口{
公共空间f(SType a);
}
公共最终类SS实现S{
公共void f(散列集a){
// ...
}
}
因为您在SS中定义了另一个不同于S中已定义的SType类的SType类。为什么要重新定义该类?使用静态嵌套类与使用顶级类没有区别。S中SType的定义为空(且为抽象).我的理解是,在实现接口时,也必须实现嵌入式类,因此我(在SS中)提供了一个名为SType的具体类。显然,这就是我出错的地方。但意图是正确的,不是吗?如何实现这一点?这种理解是错误的。该类与任何其他类一样是一个类。如果接口方法接受s.SType作为参数,则所有实现也必须接受s.SType作为参数,否则他们不尊重接口的约定。谢谢,这很清楚。现在,如果我在接口中声明SType
,而不是作为类,而是作为接口(其他一切保持不变),该怎么办?然后接口方法接受一个服从S.SType
接口的参数,由于实现中的SS.SType
是该接口的一个实现,因此代码对我来说是完全合理的。但它会导致同样的错误。不,它仍然没有意义。接口是一个契约。该接口说:I haVE是一个接受S.Pype的函数f。但是实现的意思是:我有一个函数F接受不同的东西:S.Stupe。让我们举一个具体的例子:道路是一个具有功能驱动(车辆)的接口。它说:道路的所有实现必须接受任何类型的车辆(自行车、汽车等)。。您正试图通过定义函数驱动(潜艇)来实现道路。潜艇不是车辆。即使是,道路也应该接受所有车辆,而不仅仅是潜艇。谢谢,文件是这样编译的,但出现了以下问题。当我尝试在f()的实现中使用参数(a
)时
,假设它是SS.SType
的实例(例如,通过使用HashSet
方法)编译器抱怨道。@LászlóKálman I EditedTanks,David,后一个版本工作得很好。但是,这是有代价的:SType
必须在接口外部定义。我仍然想知道接口是否可能要求其实现提供自己对某个抽象类的实现(或接口)。