首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何确保参数化类型在对象实例化之前的有效性

如何确保参数化类型在对象实例化之前的有效性
EN

Stack Overflow用户
提问于 2014-10-06 22:34:13
回答 2查看 54关注 0票数 1

在研究有效的Java第2版第23项时,我决定尝试使用构造函数实例化一个对象,该构造函数具有带有混合对象参数列表的原始集合。我假设编译器会发现我试图将一个原始类型传递给构造函数。但是,编译器只提供未经检查的异常警告,“在调用方,而不是被调用方”。

这个类编译得很好,进一步支持了乔希·布洛赫( Josh Bloch )的语句,以便在新代码中不使用原始类型。这个汇编的事实让我有点不安。

问:如何在实例化对象之前确保类的类型安全性,而不必手动检查构造函数中的对象有效性?以下只提供了来自“调用者.主要”的未经检查的赋值警告,您如何才能对此进行防御编程。

代码语言:javascript
运行
AI代码解释
复制
public class RawType {

    private final Collection<Example> example;

    public RawType( Collection<Example> example ) {
        this.example = example;
    }

    public Collection<Example> getExample() {
        return example;
    }

    public static void main( String[] args ) {

        Collection unsafe = new ArrayList();

        unsafe.add( new Example() );
        unsafe.add( new Corruption() );
        unsafe.add( new Example() );

        RawType rawType = new RawType( unsafe ); // Corruption

        for(Object type : rawType.getExample()) {
            System.out.println(type.getClass().getName()); // Mixed Classes...
        }

    }

    static class Corruption {}

    static class Example{}

}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-10-06 22:52:37

下面的行进行编译,但也会生成警告。

代码语言:javascript
运行
AI代码解释
复制
Collection unsafe = new ArrayList(); // RAW type
unsafe.add(1);                       // no compile time error (just warning)

Collection<String> example = unsafe; // assign RAW type to parametrized type
example.add(1);                      // compile time error

最好使用泛型集合来避免这种情况,然后在其中添加值。从不混合未加工和参数化类型。

请看下面的代码:

代码语言:javascript
运行
AI代码解释
复制
Collection<Integer> unsafe = new ArrayList<Integer>();
unsafe.add(1);
Collection<String> example = unsafe; // compile time error

阅读更多...

如果无法避免原始类型,那么在构造函数中使用下面的代码:

代码语言:javascript
运行
AI代码解释
复制
Collection unsafe = new ArrayList(); 
unsafe.add(1);                       
unsafe.add("hello");

// in the constructor, just add String values from the unsafe collection
Collection<String> example = new ArrayList<String>(); 
for(Object value:unsafe){
    if(value instanceof String){
        example.add((String)value);
    }
}
票数 1
EN

Stack Overflow用户

发布于 2014-10-06 22:43:01

为了使java泛型与引入之前编写的代码兼容,您可以在任何需要类型化集合的地方使用非类型化集合。因此,集合(没有类型参数)可以传递给期望集合的构造函数。

因此,在回答您的集合时,只有在将对象添加到未键入的函数中时,才能小心。如果您想要运行时sadfety,可以在从集合中提取对象类型时手动验证它们的类型。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26229918

复制
相关文章
C++类的成员函数 | 成员函数
在C++中,类的成员函数是函数的一种,它有返回值和函数类型,它与一般函数的区别只是:
小林C语言
2021/01/18
2K0
C++类的成员函数 | 成员函数
dotnet C# 如果在构造函数抛出异常 析构函数是否会执行
请问以上代码的 ~Foo 是否可以在垃圾回收执行,或者说在构造函数里面抛出异常,是否这个对象可以被垃圾回收
林德熙
2021/12/24
5040
C++类声明和成员函数定义 | 引用多个成员对象
在C++中,一般做法是将类的声明放在指定的头文件中,程序员如果想用该类,只要把有关的头文件包含进来即可,不必在程序中重复书写类的声明,以减少工 作量,提高编程的效率。
小林C语言
2021/01/25
2K0
C++类声明和成员函数定义 | 引用多个成员对象
【Python】面向对象 ② ( 类的定义和使用 | 类的成员方法 | 类成员方法定义语法 | self 关键字 )
类的成员方法 , 就是 在 类 中定义的 函数 , 在该 函数 中 , 可以调用 类的成员变量 , 以及 本类中其它的成员方法 ;
韩曙亮
2023/10/11
5060
【Python】面向对象 ② ( 类的定义和使用 | 类的成员方法 | 类成员方法定义语法 | self 关键字 )
Python 检测成员函数、成员变量是否存在的方法
AttributeError: A instance has no attribute 'fun2'
用户9127725
2022/08/08
2.9K0
Java继承类中static成员函数的重写
在java中,static成员函数是否可以被重写呢? 结论是,你可以在子类中重写一个static函数,但是这个函数并不能像正常的非static函数那样运行。 也就是说,虽然你可以定义一个重写函数,但是该函数没有多态特性。让我们测试一下: 1 class testClass1{ 2 static void SMothod(){ 3 System.out.println("static in testClass1"); 4 } 5 } 6 class testCla
老白
2018/03/19
1.7K0
C++设计模式之SFINAE:用来检测类中是否有某个成员函数
针对类中特定成员函数的检测其实在工作中也可能用到。C++中可以用SFINAE技巧达到这个目的。
果冻虾仁
2021/12/20
4.7K0
C++设计模式之SFINAE:用来检测类中是否有某个成员函数
java反射详解与反射是否会破坏类的封装性见解
       首先,封装,是将具体的实现细节隐藏,而把功能作为整体提供给类的外部使用,也就是说,公有方法能够完成类所具有的功能。当别人使用这个类时,如果通过反射直接调用私有方法,可能根本实现不了类的功能,甚至可能会出错,因此通过反射调用私有方法可以说是没有任何用处的,开发人员没有必要故意去破坏封装好的类。从这点上看,封装性并没有被破坏。(摘自百度问答)
洋仔聊编程
2019/01/15
2.3K0
taro中定义以及使用全局变量
错误的姿势 // app.tsx文件中 class App extends Component { componentDidMount() { this.user = { name: '张三', id: 1 }; } } // index.tsx 文件中 const app = Taro.getApp(); export default class Index extends Component { componentWillMount() { console.log(ap
用户1437675
2019/06/11
5.7K0
const修饰类中成员变量及函数
const在类中,可以修饰成员变量和成员函数,主要目的也是保护成员内部的一些属性不被轻易的修改。以保证数据的完整性。下面分别介绍const修饰成员变量和成员函数。
我与梦想有个约会
2023/10/20
3100
C++类成员的访问权限以及类的封装
C++通过 public、protected、private 三个关键字来控制成员变量和成员函数的访问权限,它们分别表示公有的、受保护的、私有的,被称为成员访问限定符。所谓访问权限,就是你能不能使用该类中的成员。
芯动大师
2023/10/14
4230
C++类成员的访问权限以及类的封装
C++中的空类默认包含哪些类成员函数
空类 class Empty { } 空类包含的函数(6个) class Empty { public: Empty(); // 缺省构造函数// Empty( const Empty& ); // 拷贝构造函数// ~Empty(); // 析构函数// Empty& operator=( const Empty& ); // 赋值运算符// Empty* operator&(); // 取址运算符 const Empty* operator&() const; // 取址运算符 const };
全栈程序员站长
2021/04/07
1.7K0
类A的成员函数做类B的友元函数
这种方法相对麻烦,主要是在两个类之间的前后声明有着复杂的逻辑关系。但只要我们理清思路,是可以实现的。跟着我从最初的想法到实现一步一步的理顺逻辑,就非常容易理解如何操作了。
我与梦想有个约会
2023/10/20
1930
类A的成员函数做类B的友元函数
java反射详解【转】与 反射是否会破坏类的封装性见解
       首先,封装,是将具体的实现细节隐藏,而把功能作为整体提供给类的外部使用,也就是说,公有方法能够完成类所具有的功能。当别人使用这个类时,如果通过反射直接调用私有方法,可能根本实现不了类的功能,甚至可能会出错,因此通过反射调用私有方法可以说是没有任何用处的,开发人员没有必要故意去破坏封装好的类。从这点上看,封装性并没有被破坏。(摘自百度问答)
洋仔聊编程
2022/05/10
7120
java反射详解【转】与 反射是否会破坏类的封装性见解
Python中类的成员
细分类的组成成员 之前咱们讲过类大致分两块区域 class A: name = '陈松' # 第一部分:静态字段(静态变量)部分(这一部分调用了类自己本身,表示了类自己的自身属性) def __init__(self): pass def func(self): pass # 第二部分:方法部分(这一部分表示了类可以实施的方法,可以 自己或其他进行操作) 每个区域详细划分 class A:#在方法名前面带__的属于私有 compan
星陨1357
2023/03/14
1K0
Python中类的成员
C++中类和对象以及成员函数
一个实体拥有自己的属性和行为,属性是私有的,行为是共有的,在C++中实体对应的就是对象,实体抽象数据类型就是类,属性是成员变量,行为是成员函数。
用户7886150
2021/02/04
1.4K0
C++中类成员函数作为多线程的入口
搜了一圈答案,基本上都是启动线程的时候传入this指针,在线程函数内部再强转的解决方案。可能显得有些别扭。
ApacheCN_飞龙
2019/02/15
2.9K0
【Groovy】Groovy 方法调用 ( 使用 对象名.成员名 访问 Groovy 类的成员 | 使用 对象名.‘成员名‘ 访问类的成员 | 使用 对象名[‘成员名‘] 访问类成员 )
可以使用 对象名.‘成员名’ 访问 Groovy 类的成员 , 这样写的好处是 , 不用将代码写死 , 在运行时可以自由灵活的决定要访问哪个成员 ;
韩曙亮
2023/03/30
2.5K0
【Groovy】Groovy 方法调用 ( 使用 对象名.成员名 访问 Groovy 类的成员 | 使用 对象名.‘成员名‘ 访问类的成员 | 使用 对象名[‘成员名‘] 访问类成员 )
【Kotlin】Kotlin 面向对象 ( 类 | 成员变量 | 成员方法 | 封装 | 继承 | 多态 )
② 定义字段 : 在类后的括号内 , 使用 var 字段名称:字段类型 可以定义一个字段 ;
韩曙亮
2023/03/27
6610
C++类的静态数据成员和静态成员函数
一些类对象可能会具有一些相同的属性,如果用普通数据成员来描述这些相同的属性,这意味着我们需要给每个对象的这个数据成员设定相同的值,如果改变类对象相同的属性,那么意味着我们需要对它们统一操作,这就有可能出现它们的值会不一样的情况,如果用全局变量来描述它们相同的属性,就会破坏类的独立性。
叶茂林
2023/07/30
2980

相似问题

如何在json数据中动态添加属性和值

12

如何在字典值中添加前缀和后缀

17

Map<String,String[]>;属性(如键和值对)的JSON

14

在json属性名中添加下划线前缀

11

前缀JSON值- JSON/JQuery

14
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档