我经常使用java泛型,但不知何故我仍然无法掌握一些概念。
我有一个简单的类层次结构:
public abstract class KcDashboard{..}
public class KcGroupHsDashboard extends KcDashboard{..}
小 helper
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>
as 参数无法完成,因为我可以在 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();
因此,您无法包装 Integer
当你有ObjectWrapper<Double>
时:
ObjectWrapper<T> wrapp = new ObjectWrapper<>(); // T is Double
wrapp.wrap(Integer.valueOf("0")); // Error ...
这就是 incompatible types
的原因发生错误 - 类型安全是第一位的。这同样适用于您最初的示例。
关于Java 泛型 : Question about methods with generic return type (but no generic parameter),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52875100/