![](/img/trans.png)
[英]Java Generics: Generic Return Type Only and Generic both Return Type and Parameter Type
[英]Java Generics: Question about methods with generic return type (but no generic parameter)
我经常使用Java泛型,但仍然设法不掌握某些概念。
我有一个简单的类层次结构:
public abstract class KcDashboard{..}
public class KcGroupHsDashboard extends KcDashboard{..}
小帮手
public class ObjectWrapper<O extends Object>{
public ObjectWrapper(){}
public ObjectWrapper( O obj ){
this.obj = obj;
}
private O obj;
public O unwrap() {
return obj;
}
public void wrap(O obj) {
this.obj = obj;
}
}
我有问题的代码:
public <D extends KcDashboard> D getTransientDashboard(){
...
ObjectWrapper<D> wrapp = new ObjectWrapper<>();
wrapp.wrap( new KcGroupHsDashboard() ); // Gives: The method wrap(D) is not applicable for KcGroupHsDashboard
return wrapp.unwrap();
}
无法传递Class<D>
作为参数,因为我可以在getTransientDashboard
方法中包装并返回不同的类型。
从我得到的方法中删除类型:
public KcDashboard getTransientDashboard(){
...
ObjectWrapper<KcDashboard> wrapp = new ObjectWrapper<>();
wrapp.wrap( new KcGroupHsDashboard() );
return wrapp.unwrap();
}
可以正确编译。
我知道我想念什么,但是呢?
让我们看一个经过稍微修改的示例,以便更好地理解该问题:
public <T extends Number> T getTransientDashboard() {
ObjectWrapper<T> wrapp = new ObjectWrapper<>();
wrapp.wrap(Integer.valueOf("0")); // Error: Integer cannot be converted to T
return wrapp.unwrap();
}
其中T
可以是Number
或其子类之一(例如Double):
ref.<Double>getTransientDashboard();
结果,当您拥有ObjectWrapper<Double>
时,您将无法包装Integer
:
ObjectWrapper<T> wrapp = new ObjectWrapper<>(); // T is Double
wrapp.wrap(Integer.valueOf("0")); // Error ...
这就是为什么发生incompatible types
错误的原因-类型安全性是第一位的。 最初的示例也是如此。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.