泛型 - 我错过了什么或者有什么意义?

mez*_*hic 3 java generics

我有以下代码:

public class AClass<X extends AnInterface> implements AnotherInterface {

    public AClass(X x){
    }

}
Run Code Online (Sandbox Code Playgroud)

为什么我会X用作构造函数参数类型,当我可以用它替换它时AnInterface?当然,他们的意思是同一件事,什么是子类型AnInterface

我试图将所有参数类型保持为通用,并且仅在通用参数声明中提及接口名称,例如"X扩展AnInterface"但遇到问题,因为它说的是我传入的值,类型为AnInterface,不等于输入X.

编辑:

public void<X extends AnInterface> myMethod(){


    AnInterface b = new ADiffClass();
    AnotherInterface a = new AClass(b);
}

public class ADiffClass<X extends AnInterface> implements AnInterface {

    public ADiffClass(){
    }

}
Run Code Online (Sandbox Code Playgroud)

这是我遇到问题的地方,我得到一个编译错误,说b的类型是AnInterface,并且AClass的构造函数中所需的类型是X.

Fra*_*eth 6

假设你有这种情况:

public class AClass<X extends AnInterface>{

    public AClass(X x){
        ...
    }

    public X getIt() {
        ...
    }

}
Run Code Online (Sandbox Code Playgroud)

创建对象的人将具有相应的接口,在这种情况下它将是有用的.

例如:

// supposing DefaultAnInstance is an implementation of AnInstance interface
DefaultAnInterface obj = new DefaultAnInterface();
AClass<DefaultAnInterface> instance = new AClass<DefaultAnInterface>(obj);
...
// for the user getIt will return an objecct of type DefaultAnInterface
DefaultAnInterface obj = instance.getIt(); // there is no need to cast it to DefaultAnInterface
Run Code Online (Sandbox Code Playgroud)


JB *_*zet 6

如果你声明一个这样的变量:

private AClass<Foo> a;
Run Code Online (Sandbox Code Playgroud)

以下内容有效:

 a = new AClass<Foo>(new Foo());
Run Code Online (Sandbox Code Playgroud)

但以下不是:

 a = new AClass<Foo>(new Bar());
Run Code Online (Sandbox Code Playgroud)

(假设Foo并且Bar是两个实现AnInterface).

在这种情况下,这就是泛型:将类型限制为实现(或扩展)AnInterface的特定类型.

  • 这并没有真正回答*为什么*在这种情况下你想要使用泛型.他问为什么你不能只接受构造函数中的接口并使用:`new AClass(new Foo());`和`new AClass(new Bar());`(即:在这里使用泛型有什么好处?). (3认同)