我有一些这样的代码:
@SuppressWarnings({"unchecked", "rawtypes"})
List<String> theList = new ArrayList();
这是类型安全的吗?我认为这是安全的,因为我没有将原始类型分配给其他任何类型。我什至可以在调用时演示它执行类型检查add
:
theList.add(601); // compilation error
我读过“什么是原始类型,为什么我们不应该使用它?” 但我认为它不适用于这里,因为我仅使用原始类型 创建
列表。之后,我将其分配给参数化类型,那么可能会出错吗?
还有,那呢?
@SuppressWarnings({"unchecked", "rawtypes"})
List<String> anotherList = new ArrayList(theList);
第一个是类型安全的,因为列表为空,但仍不建议使用。在这里使用原始类型没有任何 好处 。最好设计成远离警告而不是抑制它。
二是绝对 不 类型安全的,因为theList
可能是List<Integer>
例如:
import java.util.*;
public class Test {
public static void main(String[] args) throws Exception {
List<Integer> integers = new ArrayList<>();
integers.add(0);
List<String> strings = new ArrayList(integers);
// Bang!
String x = strings.get(0);
}
}
请注意,构造函数本身是如何被无例外调用的-它无法让您知道您 实际上 试图构造的列表类型,因此它不执行任何强制转换。但是,当您随后 获取
值时,该值隐式转换为,String
并获得ClassCastException
。
问题内容: Java中的原始数据类型是否像&线程安全的?我执行了以下代码,但有时无法看到500的预期结果。 在这里,并发500个线程将更新int变量。等待并发更新完成后的主线程输出值。 在这里找到类似的例子 问题答案: 不安全的三种方式: 并且甚至不保证会自动进行更新(您可能会看到来自不同线程的写入的一半) 内存模型不能保证您会看到一个线程在另一个线程中的最新更新,而没有某种额外的内存障碍 无论如
问题内容: Eclipse在正在运行的项目中仅使用以下代码(在其中仅包含伪类和main方法)给我警告(标题中): 最后一行触发警告。我不确定我在这里做错了什么,或者实际上我在做什么。我是一名Java学生,正在研究一个可疑的教程,并且试图理解泛型。假设变量x不能说明类型安全性。我尝试将其强制转换为对象类型(我认为它没有任何作用,因为它已经存在了),并且不起作用。 我如何解决此警告? 问题答案: 您声
在下面来自的语法中,泛型类型参数在实例化原始类型数组后用于类型转换,
问题内容: 我很好奇Java的类和double的原始类型之间的性能差异是什么。因此,我创建了一个基准测试,发现类类型比原始类型慢3到7倍。(在本地计算机OSX上为3x,在ideone上为7x) 这是测试: http://ideone.com/fDizDu 那么为什么Double类型要慢得多呢?为什么还要实施它以允许数学运算符? 问题答案: 那么为什么Double类型要慢得多呢? 因为该值包装在需要
这段代码给出了一个运行时错误: < li >为什么< code>b.get()不会触发运行时错误? < li >为什么只有当我试图获取class变量的类时才会出现运行时错误? 更准确地说:为什么编译器仅为第二个(导致异常)在字节码中插入指令?
如果类型参数在创建期间传递了npt,则原始类型是泛型类或接口的对象。 以下示例将展示上述概念。 例子 (Example) 使用您选择的任何编辑器创建以下Java程序。 GenericsTester.java package com.wenjiangs; public class GenericsTester { public static void main(String[] args) {