首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何使用 Java 泛型来避免 ClassCastException

使用泛型时需要在实例化泛型时实际类型参数传递给类型参数 定义泛型例子 在本例子中,我们实现一个简易容器Container,该容器类型存储相应参数类型对象,使其能够存储各种类型 class Container... 中 E 无界类型参数,通俗讲就是什么类型都可以,可以任何实际类型参数传递给 E ....这个接口提供了一个 int compareTo (t o)方法,该方法当前对象与参数(类型 t)进行比较, 当该对象小于、等于或大于指定对象时返回负整数、零或正整数。...我们想通过 List 类型对象传递给 printList ()方法,防止类型安全这种冲突。...在参数列表和 printList ()方法体中,因为此符号代表任何类型,所以 List 和 List 传递给方法是合法 深入探索泛型方法 假如你现在有一个业务逻辑需要你一个

2.1K40

深入理解Java泛型(三)-泛型擦除及其相关内容

)); //true 我们看输出发现,class1和class2居然是同一个类型ArrayList,在运行时我们传入类型变量String和Integer都被丢掉了。...所以,set方法在编译器可以做类型检查,非法类型不能通过编译。但是对于get方法,由于擦除机制,运行时实际引用类型Object类型。为了“还原”返回结果类型,编译器在get之后添加了类型转换。...所以,在GenericHolder.class文件main方法主体第18行有一处类型转换逻辑。它是编译器自动帮我们加进去。 所以在泛型类对象读取和写入位置我们做了处理,代码添加约束。...类型判断问题 我们可以通过下面的代码来解决泛型类型信息由于擦除无法进行类型判断问题: /** * 泛型类型判断封装类 * @param */ class GenericType{...创建类型实例 泛型代码中不能new T()原因有两个,一是因为擦除,不能确定类型;而是无法确定T是否包含无参构造函数。

58421
您找到你想要的搜索结果了吗?
是的
没有找到

Java泛型详解:和Class使用。泛型类,泛型方法详细使用实例

();    大家对ArrayList很熟悉,这里构造了三个List,分别盛装String、Integer和Double;这就是ArrayList过人之处:即各种类型变量都可以组装成对应...因为编译器也不知道你进去是什么,而floatPoint.getX()返回类型是Object,所以编译时,Object强转成String是成立。必然不会报错。...因为他类名后没有! 然后在在这里我们Info中泛型变量T定义填充为了String类型。...方法一,隐式传递了T类型,与上面一样,不建议这么做。 方法二,显示T赋值Integer类型,这样OtherMethod(T a)传递过来参数如果不是Integer那么编译器就会报错。...            return arg ;            // 返回泛型数组     }      首先,定义了一个静态函数,然后定义返回值T[],参数接收T类型可变长参数。

3.2K50

Java魔法堂:解读基于Type Erasure泛型

不同泛型类型形参无法作为不同描述符标识来区分方法 // 视为相同方法,因此会出现冲突 public void say(List msg){} public void say(List...假如现有一个泛型方法定义  T handle(T arg1, T arg2){ return arg1;}       那么根据类型擦除操作步骤,T实际类型必须是...,根据不同入参类型和对返回值进行类型转换组合导致不同结果。...但假如改成,那显式类型转换就变为必须品了。...我猜想是因为getP2书写方式导致返回值与入参两者类型参数是没有任何关联无法保证一定能成功地执行隐式类型转换,因此规定开发人员必须进行显式类型转换,否则就无法通过编译。

1.1K80

Java魔法堂:解读基于Type Erasure泛型

不同泛型类型形参无法作为不同描述符标识来区分方法 // 视为相同方法,因此会出现冲突 public void say(List msg){} public void say(List...假如现有一个泛型方法定义  T handle(T arg1, T arg2){ return arg1;}       那么根据类型擦除操作步骤,T实际类型必须是...,根据不同入参类型和对返回值进行类型转换组合导致不同结果。...但假如改成,那显式类型转换就变为必须品了。...我猜想是因为getP2书写方式导致返回值与入参两者类型参数是没有任何关联无法保证一定能成功地执行隐式类型转换,因此规定开发人员必须进行显式类型转换,否则就无法通过编译。

99950

搞明白 Java 通配符泛型

但是,从 向父类扩大泛型 List 获取返回值【E get(int i)】时候, E 类型没有办法获取了,因为不知道你进去到底是 List 还是 List,所以统一向上转 E Object...时候,E 类型被统一 Number,因为不知道你进去到底是 List 还是List,返回时候都可以向上转到 Number。...(),new ArrayList()); 这里不知道你有没有疑问,为什么它既用 super 又用 extends 呢,因为这里用于静态函数,所以T类型是调用时才确定,那么T到底应该是 Integer...创建时候确定了,我们以 Stream 例,T就是 Integer 我们看到 Function中 T 类型是: ?...super T 意味着不光 Integer 可以作为 Function 传入参数,它父类也可以,比如 Number,上面例子是 Integer 接着是定义 R 类型即返回值类型:?

50820

Lambda表达式

在其它语言中,Lambda 表达式类型是一个函数;但在 Java 中,Lambda 表达式被表示对象,因此它们必须绑定到被称为功能接口特定对象类型。...; // 参数调用 getAge 方法 Integer age = getAge.apply(p); 我们引用 getAge,然后将其应用于正确参数。...目标引用参数类型是 Function,T 表示传入类型,R 表示返回类型。...Arrays.asList()数组转换为集合后,底层其实还是数组,《阿里巴巴》Java 开发使用手册对于这个方法有如下描述: ? 如何正确数组转换为ArrayList?...下面的例子,我们 Lambda 表达式 x -> x*x传递给map()方法,将其应用于流所有元素。之后,我们使用 forEach打印列表所有元素。

66830

Java泛型深入理解「建议收藏」

例如,你可以方法参数类型设置基类,那么该方法就可以接受从这个基类中导出任何类作为参数,这样方法将会更具有通用性。此外,如果方法参数声明为接口,将会更加灵活。...假定我们预想是利用stringValues来存放String集合,因为ArrayList只是维护一个Object引用数组,我们无法阻止Integer类型(Object子类)数据加入stringValues... array=new ArrayList(); // 这样调用add方法只能存储整形,因为泛型类型实例Integer array.add...也就是说,编译器把这个方法调用翻译为两条字节码指令: 对原始方法Pair.getValue调用 返回Object类型强制转换为Integer 此外,存取一个泛型域时,也要插入强制类型转换。...它们之间第二点区别是,你可以把任何带参数泛型类型递给接受原始类型List方法,但却不能把List传递给接受List方法,因为会产生编译错误。

77020

java之泛型

泛型是JDK1.5新加入,解决数据类型安全性问题,其主要原理是在类声明时通过一个标识表示类中某个属性类型或者是某个方法返回值及参数类型。这样在类声明或实例化时只要指定好需要具体类型即可。...java中泛型只有在编译阶段有效。在编译过程中,正确检验泛型结果后,会将泛型相关信息檫出,并且在对象和离开方法边界处添加类型检查和类型转换方法。也就是说,泛型信息不会进入到运行阶段。...A a2 = new A(); //这里setKey中接受参数Integer类型,因为在实例化时候声明了Integer泛型 a2...//在类上定义泛型,可以在普通方法中使用 private E e; public static void test3(T t) { //在静态方法中不能使用类定义泛型...); return s; } //带有可变参数方法泛型 public void test2(T... args) { for(T arg

30320

【Java 泛型】泛型用法 ( 泛型类用法 | 泛型方法用法 | 泛型通配符 ? | 泛型安全检查 )

getData2(T arg){ T data = arg; return data; } 指定泛型方法 : 指定 泛型方法 泛型类 , 泛型方法 泛型声明...getData2("Mouse"); 不指定泛型方法 : 泛型方法 中 也可以不声明泛型类型 , 传入参数是 泛型 T 类型 , 如果给传入参数设置 String..., 隐含泛型 T 设置 String 类型 ; // 泛型方法 中 也可以不声明泛型类型 // 传入参数是 泛型 T 类型 //...如果给传入参数设置 String , 隐含泛型 T 设置 String 类型 String data2 = student.getData2("Mouse"); 三、泛型通配符 getData2("Mouse"); // 泛型方法 中 也可以不声明泛型类型 // 传入参数是 泛型 T 类型

10.1K30

Java - 泛型

ArrayListInteger称为实际类型参数(ActualTypeArgument),上面的E相当于形参,这里Integer相当于实参 ● ArrayList整个被称为泛型类型...但是这种集合只允许往外读取Object类型元素,因为无法确定集合中元素具体类型,出于类型安全就只能作为Object类型被读取。如果读取元素进行强制类型转换,就要注意是否会发生类转换异常。...>可指定上下界,且只能用于使用泛型场合。 ● 用于确保泛型参数一致性,比如一个方法参数是多个泛型T,那么调用方法参时都必须是相同类型;但如果一个方法参数是多个泛型通配符?...,则调用时参不需要保持相同类型,因为?表示随机类型。 ● 可以使用多重限定,而不可以。 ● 无法创建参数化类型数组,但可以。...也就是说,泛型类泛型参数默认就是非静态。 但是,对于泛型方法,则可以被定义静态。原因是泛型方法方法调用时明确类型,与类实例化无关,所以允许定义静态

54720

Java核心技术之什么是泛型

泛型提供了一种集合类型递给编译器方法,以便可以对其进行检查。一旦编译器知道集合元素类型,编译器就可以检查您是否一致地使用了集合,并且可以对从集合中取出值插入正确强制转换。...与方法声明中使用更熟悉形式参数非常相似,类型参数您提供了一种使用不同输入重复使用相同代码方法。区别在于形式参数输入是值,而类型参数输入是类型。...,类型信息传递给具体泛型代码。...所有的类型参数都用它们限定类型替换。 桥接方法被合成来保持多态。 保持类型安全性,必要时插入强制类型转换。...} } 7、重载方法里不能有两个相同原始类型方法 // 因为类型檫除后,两个方法具有相同签名,重载共享相同类文件表示形式,并且生成编译时错误。

64720

再次理解泛型

(list); } 编译上面的程序,发生如下错误: 不兼容类型: List无法转换为List 表明List对象不能被当成List来使用。...> integer = new Apple(2); //下面编译失败,视图String类型传给形参T //是String不是Number子类,...list3,list4);//泛型T String 类型 } copy方法中带有一个带T泛型形参,但是在调用时候 泛型参数String,Integer类型,编译器无法准确推断出泛型方法中泛型形参类型...list3,list4);//泛型T String 类型 } 这种采用了类型通配符方式,只要copy方法前一个集合元素类型是最后一个集合元素子类即可。...> list1 = new ArrayList(); //该方法复制了一个新集合,返回值list集合 返回值泛型 List copy = copy

43810

【Java 基础 - 泛型机制详细解释】

;一个是ArrayList泛型类型,只能存储整数,最后,我们通过list1对象和list2对象getClass()方法获取他们信息,最后发现结果true。...ArrayList list = new ArrayList(); list.add(1); //这样调用 add 方法只能存储整形,因为泛型类型实例...(); 如果是与以前代码兼容,各种引用值之间,必然会出现如下情况: ArrayList list1 = new ArrayList(); //第一种 情况 ArrayList...Pair,在子类中,我们覆盖了父类两个方法,我们原意是这样父类泛型类型限定为Date,那么父类里面的两个方法参数都为Date类型。...如果是我们自己编写Java代码,这样代码是无法通过编译器检查,但是虚拟机却是允许这样做,因为虚拟机通过参数类型和返回类型来确定一个方法,所以编译器为了实现泛型多态允许自己做这个看起来“不合法”

31710

Java之泛型详解

当调用get时候, 不需要进行强制类型转换,编译器就知道返回值类型 String,而不是Object。 然后add方法添加类型也会固定为String了,如果add其它类型无法通过编译。...对象,泛型参数类型Integer MyClass integerMyClass = new MyClass(); //实例化一个stringMyClass...对象,泛型参数类型String MyClass stringMyClass = new MyClass(); //设置t:new Integer...(10) integerMyClass.set(new Integer(10)); //设置t:new String("这个泛型类是指定String类型")...现在该方法变量 smallest 类型 T, 这也意味着它可以是任何一个类对象。怎么才能确信T所属类有compareTo方法呢? 那么这个时候我们就可以通过对类型变量T设置限定解决。

56110

java泛型详解

如果我们在对一个对象所赋值不符合其泛型规定, 就会编译报错 避免强转: 比如我们在使用List时, 如果我们不使用泛型, 当从List中取出元素时, 其类型会是默认Object, 我们必须将其向下转型..., 就是说后面的泛型可以省略直接写成, 反正前后一致(类型推断) #### 定义方法 修饰符 返回值类型 方法名(形参列表) { 方法体 } public class Main{ /...类似这样错误假如出现才实际应用场景中,非常难以察觉。...); } // … } 这也就是为什么上面会报错原因了,setData((Integer) data);时候String无法转换成Integer。...,正如我们上面验证过JVM在运行时期无法识别出ArrayListArrayList之间区别: public staticvoid rtti(Listlist)

31910
领券