Java 泛型接口转换

     2023-02-22     163

关键词:

【中文标题】Java 泛型接口转换【英文标题】:Java Generics Interface casting 【发布时间】:2014-05-03 03:25:01 【问题描述】:

我偶然发现了一个涉及我不理解的泛型和接口的 Java 转换情况。

请考虑以下我创建List<Interface1> 的代码。然后 get() 一个元素并将其转换为 Interface2 不会出现编译器错误,尽管这两个接口完全不相关。

import java.util.*;

public class Main 
  public static void main(String ... args) 
    List<Interface1> list = new ArrayList<>();
    list.add(new Interface1() );

    Interface1 ok = list.get(0);
    Interface2 why = (Interface2)list.get(0);
  


interface Interface1 


interface Interface2 

谁能解释为什么在第二个get(0) 的转换没有编译器错误?

两个旁注:执行该类会抛出一个ClassCastException(如预期的那样)。而且使用两个类而不是接口确实会产生编译错误。

【问题讨论】:

【参考方案1】:

此行为与泛型无关:您可以将任何接口转换为任何其他接口而不会出现编译错误。

您不能对类执行此操作,因为 Java 可以在编译时检查一个类是否可以转换为另一个类。

但是,对于接口,转换可能会成功或失败,具体取决于实际实现接口的类。不过,这只能在运行时发现。

【讨论】:

【参考方案2】:

有可能,Interface1 的子类也可以是Interface2 的子类。所以,它不会给出编译错误。

【讨论】:

【参考方案3】:

如果你有一个实现Interface1 的类型,它也可以实现Interface2。因此编译器不会责怪你,因为在运行时转换可能会成功。

【讨论】:

【参考方案4】:

这不是一般问题。 JVM 对Interface1Interface2 之间的兼容性一无所知。所以你得到ClassCastException

【讨论】:

不正确,如果一个对象实现了这两个接口。 @SilviuBurcea 这里Interface1Interface2 两个不同的接口。 Silviu 的观点是,Interface1 和 Interface2 是不同的接口这一事实并不自动意味着实例化对象不会同时实现这两者。由于编译器不知道这一点,它将允许强制转换。 ClassCastException 发生是因为匿名类没有实现 Interface2。【参考方案5】:

这是因为 JAVA 支持多种接口实现。由于我们可以有任意数量的任何类型的类(任何父类)可以实现一个接口,JVM 设计是这样的,直到运行时,我们才能识别在该接口的位置传递哪种类型。所以可以有任何接口放置在数组列表

【讨论】:

【参考方案6】:

编译器不知道这不起作用:您可以有一个 Interface2 类型的实例,它也是 Interface1 类型的实例(例如:class ImplementingClass implements接口 1,接口 2)。那么演员阵容就好了。

“使用两个类而不是接口实际上会产生编译错误。”

在这种情况下,编译器知道它不会工作,因此在这种情况下您会遇到编译错误。

【讨论】:

java泛型

1.可以利用Object类实现泛型,但这种方法必须进行强制类型转换,容易出错。2.泛型类就是把数据类型参数化。3.泛型类的参数可以是泛型类。4.泛型类可以同时设置多个类型参数。5.泛型类可以继承泛型类。6.泛型类可以实现泛型... 查看详情

java--泛型--泛型接口&泛型方法(代码片段)

泛型接口  packagecom.model.fanxing;/***@Description:测试类*@Author:张紫韩*@Crete2021/6/3022:14*泛型接口和实现类*1.泛型接口的实现类,是一个泛型类,那么要保证实现接口的泛型类的反省表示中要包含泛型接口的泛型标识*2.泛型接口... 查看详情

使用内部类型作为接口转换泛型

】使用内部类型作为接口转换泛型【英文标题】:Castinggenericwithinnertypeasinterface【发布时间】:2022-01-2110:49:10【问题描述】:.NETFiddleusingSystem;interfaceInterfaceclassOuter<T>:InterfacewhereT:InterfaceclassInner:InterfacepublicclassProgrampubli 查看详情

java泛型的应用

---恢复内容开始---在开发中,我们有时候会用到泛型来写工具类,为了使方法更通用,以前,没有完全弄懂,今天,就这个机会把泛形写一写泛型是JavaSE1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定... 查看详情

泛型、接口和强制转换问题

】泛型、接口和强制转换问题【英文标题】:Issuewithgenerics,interfaces,andcasting【发布时间】:2013-06-0612:51:24【问题描述】:我最近为我实现的一些自定义用户控件添加了一个界面。界面非常基本。它有一种支持链接的方法:PublicInt... 查看详情

关于泛型

软件152笪世海泛型是JavaSE1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。Java语言引入泛型的好... 查看详情

java之泛型

1、为什么要有泛型Generic?2、总结Java中的泛型,只在编译阶段有效。在编译过程中,正确检验泛型结果后,会将泛型的相关信息擦出,并且在对象进入和离开方法的边界处添加类型检查和类型转换的方法。也就是说,泛型信息不... 查看详情

java的iterator迭代器补充,增强for循环,泛型,list接口,set接口

1、Iterator迭代器:(1)类型转换异常:ClassCastException;集合中存放的是多个对象时,在强转时会出现;packagecom.oracle.demo01;importjava.util.ArrayList;importjava.util.Collection;importjava.util.Iterator;publicclassdemo01{publicstaticvoi 查看详情

java泛型简单剖析与使用(代码片段)

...c;所以许多重要的类,比如集合框架,都已经成为泛型化的了,这带来了很多好处。类型安全:使用泛型可以使编译器知道变量的类型限制,进而可以在更高程度上验证类型假设。如果不用泛型,则必须使... 查看详情

java泛型的其他应用——泛型接口泛型方法泛型数组以及泛型的嵌套设置

学习目标掌握泛型接口的使用掌握泛型方法的定义的及使用掌握泛型数组的使用掌握泛型的嵌套设置之前所有的操作都是在类中直接使用泛型操作的,那么,对于Java来说,也可以直接在接口中定义及使用泛型。定义泛型接口在JD... 查看详情

java实训笔记——-抽象类-接口-泛型-集合

1.1方法的可变参数从JDK1.5之后,定义方法时参数的个数可以变化语法:最后一个数据类型后增加3个点注意:1.可变参数只能处于参数列表的最后;2.一个方法中最多只能包含一个可变参数;3.可变参数的本质就是一个数组,因此... 查看详情

为啥接口的泛型方法可以在 Java 中实现为非泛型?

】为啥接口的泛型方法可以在Java中实现为非泛型?【英文标题】:Whyagenericmethodofaninterfacecanbeimplementedasnon-genericinJava?为什么接口的泛型方法可以在Java中实现为非泛型?【发布时间】:2016-08-1002:49:11【问题描述】:假设我们有几... 查看详情

java泛型:泛型类泛型接口和泛型方法

原文出自:https://segmentfault.com/a/1190000002646193泛型类publicclassContainer<K,V>{privateKkey;privateVvalue;publicContainer(Kk,Vv){key=k;value=v;}publicKgetKey(){returnkey;}publicvoidsetKey(Kkey){thi 查看详情

java泛型:泛型类泛型接口和泛型方法

根据《Java编程思想(第4版)》中的描述,泛型出现的动机在于:有许多原因促成了泛型的出现,而最引人注意的一个原因,就是为了创建容器类。泛型类容器类应该算得上最具重用性的类库之一。先来看一个没有泛型的情况下... 查看详情

java泛型是什么?一文带你吃透泛型(代码片段)

文章目录1.Java泛型2.泛型类3.泛型接口4.泛型方法5.泛型集合Java编程基础教程系列1.Java泛型Java泛型是JDK1.5中引入的一个新特性,其本质是参数化类型,把类型作为参数传递。其主要的形式有泛型类,泛型接口和泛型方法。泛型概... 查看详情

java泛型示例-泛型方法,类,接口

...版本,那么我确定您已经使用过它。Java中具有集合类的泛型非常容易,但是它提供了比仅创建集合类型更多的功能。我们将在本文中尝试学习泛型的功能。如果我们使用专业术语,对泛型的理解有时会变得混乱,因此,我将尽... 查看详情

Java 泛型接口与泛型方法,以及何时使用其中一种

】Java泛型接口与泛型方法,以及何时使用其中一种【英文标题】:JavaGenericInterfacevsGenericMethods,andwhentouseone【发布时间】:2015-08-1500:38:41【问题描述】:我想知道,除了句法差异之外,什么时候可以在接受泛型参数的方法上使用... 查看详情

接口上的 C# 泛型隐式强制转换失败

】接口上的C#泛型隐式强制转换失败【英文标题】:C#genericimplicitcastonInterfacefailed【发布时间】:2010-11-2520:17:41【问题描述】:为什么下面的不能编译?当T是一个接口时,导致编译器认为它不能从Container&lt;T&gt;转换为T的接... 查看详情