Java 泛型 : Question about methods with generic return type (but no generic parameter)

标签 java generics jakarta-ee

我经常使用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/

相关文章:

java - Jersey - WebResource 类型中的方法accept(MediaType[]) 不适用于参数(字符串)

java - 如何创建一个程序,允许用户决定扫描仪输入的数量,然后将扫描仪分为正数和负数数组?

generics - 可选地传递泛型参数?

java - 通用容器的通用工厂

java - 如何停止在每次请求时向服务器发送 cookie

java - 监听器触发的错误 404

java - Thymeleaf 构造带有变量的 URL

java - native Java 文档解析器和转换器库/基于 linux 的文档转换器

java - 如何通过泛型使子类型元素需要特定的子类型访问者,从而使访问者模式更具可扩展性?

java - 如何将 3rd 方 JAR 打包到 EJB jar 中?