Java泛型和类型转换怎么实现?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (6)
  • 关注 (0)
  • 查看 (1770)

我有一个创建得很糟糕的容器对象,它将不同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) {
    ;
}
提问于
用户回答回答于

泛型强制转换方法导致编译器发出未经检查的警告。未选中的警告表示在运行时没有(完全)检查强制转换问题,也就是说,即使值不是正确的类型,它也可能成功。这会导致变量保存与声明的类型不兼容的值,Java语言规范调用的情况堆污染...

以下程序演示了这一点:

class Holder {
    Object value;

    Holder(Object value) {
        this.value = value;
    }

    <T> T get() {
        return (T) value;
    }
}

class C<T> {
    T value;

    C(Holder h) {
        value = h.get();
    }
}

public class Test {
    public static void main(String [] args) throws IOException {
        Holder holder = new Holder("Hello");
        C<Integer> c = new C<Integer>(holder);
        System.out.println("I just put a String into a variable of type Integer");

        // much later, possibly in a different part of your program
        c.value.longValue(); // throws ClassCastException
    }
}

因此,我强烈建议使用选中的强制转换。检查普通的转换(第一种方法)和反射的转换(第三种方法)。但是,反射式转换不能用于参数化类型(List<String>.class不编译)。

因此,最简单和最灵活的安全解决方案是普通cast。

热门问答

linux如何限制单一ip对服务器的日访问量?

小爱同学

腾讯云 · 技术支持 (已认证)

推荐
您根据当前网站规模和业务了解下【网站管家 WAF】,企业站点可有效抵御恶意攻击,垃圾访问。 图片.png 您反馈网站短信验证码被盗刷,也可结合自己业务,可自行部署iptables进行手动拦截。或其他方式 例如您的网站是nginx,在web配置文件中开启配置HttpLimitR...... 展开详请

兼容性测试只能上传apk测试的吗?

WeTest质量开放平台团队专注游戏,提升品质
推荐

目前不支持公众号的兼容测试,还请知晓

关于群自动解散的问题?

安稳

腾讯科技 · 工单技术支持 (已认证)

推荐
您好,临时群是没有的。云通信的群组只有私有群(Private)、公开群(Public)、聊天室(ChatRoom)、音视频聊天室(AVChatRoom)和在线成员广播大群(BChatRoom)这五种。 您说的这个需求,思路:创建群组时,服务端记录一下时间,到达约定解散的时间以后,...... 展开详请

腾讯云短信接收方对控制台发出的短信做出回应,比如说回复短信“你好”,控制台是否能收到回复的内容?

您好,国内短信可在 短信控制台->国内短信->统计分析->短信记录->回复记录 查看用户回复的短信。 同时可配置文本短信回复回调,配置后会推送相关回复到用户服务器。 统计分析:https://cloud.tencent.com/document/product/382/18062...... 展开详请

不同账号的三台服务器用内网ping不通?

不同账号的服务器本来就已经独立划分,内网肯定是不通的,公网各自都有自己的公网,通是一定的,具体不同账号内网不通你可以参考私有网络VPC的定义。同地域不同账户的不同 VPC 相互隔离,但可以通过建立 同账户同地域对等连接同账户跨地域对等连接 实现内网互联。

对象存储单个文件大于5GB不能改变存储类型为归档存储,那么我上传的时候可以直接指定为归档存储吗?

Lew

腾讯云对象存储 · 工程师 (已认证)

推荐已采纳

可以的,coscmd upload a.txt a.txt -H "{'x-cos-storage-class':'Archive'}" -H 参数可以添加自定义的header

所属标签

扫码关注云+社区