相关疑难解决方法(0)

Java泛型类型擦除:何时以及发生了什么?

在Oracle的网站上读到了Java的类型擦除.

什么时候发生类型擦除?在编译时还是运行时?当班级加载?当类被实例化时?

很多站点(包括上面提到的官方教程)都说在编译时会发生类型擦除.如果在编译时完全删除了类型信息,那么当调用使用泛型的方法而没有类型信息或错误的类型信息时,JDK如何检查类型兼容性?

考虑以下示例:Say class A有一个方法,empty(Box<? extends Number> b).我们编译A.java并获取类文件A.class.

public class A {
    public static void empty(Box<? extends Number> b) {}
}
Run Code Online (Sandbox Code Playgroud)
public class Box<T> {}
Run Code Online (Sandbox Code Playgroud)

现在我们创建另一个类B,该类empty使用非参数化参数(原始类型)调用该方法:empty(new Box()).如果我们编译B.javaA.class在类路径中,javac的是足够聪明,引发警告.所以A.class 一些类型信息存储在其中.

public class B {
    public static void invoke() {
        // java: unchecked method invocation:
        //  method empty in class A is applied to given types
        //  required: Box<? extends java.lang.Number>
        //  found: …
Run Code Online (Sandbox Code Playgroud)

java generics type-erasure

233
推荐指数
6
解决办法
8万
查看次数

杰克逊和泛型类型参考

我想使用jackson json库作为通用方法,如下所示:

public MyRequest<T> tester() {
    TypeReference<MyWrapper<T>> typeRef = new TypeReference<MyWrapper<T>>();  
    MyWrapper<T> requestWrapper = (MyWrapper<T>) JsonConverter.fromJson(jsonRequest, typeRef);
    return requestWrapper.getRequest();
}
Run Code Online (Sandbox Code Playgroud)

...

public class MyWrapper<T> {

    private MyRequest<T> request;

    public MyRequest<T> getRequest() {
        return request;
    }

    public void setRequest(MyRequest<T> request) {
        this.request = request;
    }
}


 public class MyRequest{
     private List<T> myobjects;

     public void setMyObjects(List<T> ets) {
         this.myobjects = ets;
     }

     @NotNull
     @JsonIgnore
     public T getMyObject() {
         return myobjects.get(0);
     }
}
Run Code Online (Sandbox Code Playgroud)

现在的问题是,当我调用请求对象内的getMyObject()时,jackson将嵌套的自定义对象作为LinkedHashMap返回.有没有什么方法可以指定需要返回T对象?例如:如果我发送了Customer类型的对象,那么应该从该列表返回Customer?

谢谢.

java generics json jackson

96
推荐指数
2
解决办法
12万
查看次数

如何将Jackson的TypeReference与泛型一起使用?

对于json映射,我使用以下方法:

public static <T> T mapJsonToObject(String json, T dtoClass) throws Exception {
    ObjectMapper mapper = new ObjectMapper();
    return mapper.readValue(json, new TypeReference<RestResponse<UserDto>>() {
    });
}
Run Code Online (Sandbox Code Playgroud)

UserDto看起来像这样:

@JsonIgnoreProperties(ignoreUnknown = true)
public class UserDto {

    @JsonProperty("items")
    private List<User> userList;

    public List<User> getUserList() {
        return userList;
    }

    public void setUserList(List<User> userList) {
        this.userList = userList;
    }
}
Run Code Online (Sandbox Code Playgroud)

我想改进这种映射方法,而不必附加到UserDto类,而是将其替换为通用类。

可能吗?如何?

谢谢。

java generics mapping json jackson

6
推荐指数
2
解决办法
8903
查看次数

Jackson 从 Class 创建 JavaType

必须有一种方法来创建一个JavaTypefrom String.class?

注意:该方法的输入必须 JavaType适用于我的用例,因为该值是使用TypeFactory.

/** Returns a JavaType for Map<String, valueType> **/
private static JavaType stringToJavaType(JavaType valueType) {
    TypeFactory typeFactory = objectMapper.getTypeFactory();
    // this does not compile, can't mix Class and JavaType
    return typeFactory.constructMapType(Map.class, String.class, valueType);
}
Run Code Online (Sandbox Code Playgroud)

如果我可以回答一个相关的问题,constructMapTypeover 有constructParametricType什么好处?

java class jackson jackson2

6
推荐指数
2
解决办法
3067
查看次数

标签 统计

java ×4

generics ×3

jackson ×3

json ×2

class ×1

jackson2 ×1

mapping ×1

type-erasure ×1