我有以下代码:
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.
假设你有这种情况:
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)
如果你声明一个这样的变量:
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的特定类型.
| 归档时间: |
|
| 查看次数: |
117 次 |
| 最近记录: |