Java 泛型和类型转换

2022-09-02 13:54:11

我有一个创建糟糕的容器对象,它将不同java类型的值(字符串,布尔值等)保存在一起。

public class BadlyCreatedClass {
    public Object get(String property) {
        ...;
    }
};

我们以这种方式从中提取价值

String myStr = (String) badlyCreatedObj.get("abc");
Date myDate = (Date) badlyCreatedObj.get("def");

我被迫使用此对象编写一些新代码,我正在尝试查看是否有干净的方法来执行此操作。更具体地说,下面哪种方法更可取?

显式转换

String myStr = (String) badlyCreatedObj.get("abc")
Date myDate = (Date) badlyCreatedObj.get("def");

使用通用强制转换

public <X> X genericGet(String property) {

}

public String getString(String property) { 
return genericGet(property); 
}

public Date getDate(String property) { 
return genericGet(property); 
}

使用 Class.cast

<T> T get(String property, Class<T> cls) {
    ;
}

我已经经历了几个关于SO Java泛型函数的相关问题:如何返回泛型类型Java泛型返回类型,所有这些似乎都说这样的类型转换是危险的,虽然我没有看到三者之间有太大的区别,但鉴于此,您更喜欢哪种方法?

谢谢


答案 1

为了给出一个快速的答案,而不深入讨论好的编程实践......

我会使用:

private <X> X genericGet(String property) {

}

public String getString(String property) { 
//... checks on property (String specific)...
Object obj = genericGet(property);
//... checks if obj is what is expected and if good return it
return obj; 
}

public Date getDate(String property) { 
//... checks on property (Date specific)...
Object obj = genericGet(property);
//... checks if obj is what is expected and if good return it
return obj
}

注意私有泛型Get。通过这种方式,我可以检查get属性是否是我正在等待接收的,并以正确的方式处理它。

我可以在getString中添加检查,具体取决于属性,以确保答案将是String对象。

我可以在物业中对getDate进行其他检查,以确保它将是一个将被返回的日期。

等。。。


答案 2

就个人而言,将许多不同的对象保存在一个地方,然后检查要返回的内容似乎有点错误。也许你可以将持有者存储在那个糟糕的创建类中。

像这样:

class Holder {
    private long id;
    private String name;
    private Date dateofBirth;

    //getters and setters
}

然后根据 id 进行检索,因此不需要强制转换。

您也可以告诉我们您想做什么。