java不兼容的类型,Java泛型:不兼容的类型

I have a generic class MyClass with a static factory method and a setter method:

public class MyClass {

public static MyClass with(Context context) {

MyClass myClass = new MyClass<>();

myClass.context = context;

return myClass;

}

public void setClass(Class extends CustomClass> customClass) {

...

}

...

}

With the setter method, user can set any class that extends from "CustomClass".

So far so good. If I do:

MyClass myClass = MyClass.with(this);

myClass.setClass(MyCustomClass.class);

It works perfectly. But if I do:

MyClass.with(this).setClass(MyCustomClass.class);

It does not compile! The compiler outputs:

Error:(44, 87) error: incompatible types: Class cannot be converted to Class extends MyCustomClass>

I don't know why it wont compile with the second option. MyCustomClass is like:

public class MyCustomClass extends CustomClass

解决方案

Please note that you got information missing between your working example and your one-liner which has compilation error.

It doesn't know the specialization. You need to do something like

MyClass.with(this).setClass(MyCustomClass.class);

so it knows you will be 'talking strings' to it.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
第1章 Java体系结构介绍 1.1 为什么使用Java 1.2 网络带来的挑战和机遇 1.3 体系结构 1.3.1 Java虚拟机 1.3.2 类装载器的体系结构 1.3.3 Java class文件 1.3.4 Java API 1.3.5 Java程序设计语言 1.4 Java体系结构的代价 1.5 结论 1.6 资源页 第2章 平台无关 2.1 为什么要平台无关 2.2 Java的体系结构对平台无关的支持 2.2.1 Java平台 2.2.2 Java语言 2.3.3 Java class文件 . 2.2.4 可伸缩性 2.3 影响平台无关性的因素 2.3.1 Java平台的部署 2.3.2 Java平台的版本 2.3.3 本地方法 2.3.4 非标准运行时库 2.3.5 对虚拟机的依赖 2.3.6 对用户界面的依赖 2.3.7 Java平台实现中的bug 2.3.8 测试 2.4 平台无关的七个步骤 2.5 平台无关性的策略 2.6 平台无关性和网络移动对象 2.7 资源页 第3章 安全 3.1 为什么需要安全性 3.2 基本沙箱 3.3 类装载器体系结构 3.4 class文件检验器 3.4.1 第一趟:class文件的结构检查 3.4.2 第二趟:类型数据的语义检查 3.4.3 第三趟:字节码验证 3.4.4 第四趟:符号引用的验证 3.4.5 二进制兼容 3.5 Java虚拟机中内置的安全特性 3.6 安全管理器和Java API 3.7 代码签名和认证 3.8 一个代码签名示例 3.9 策略 3.10 保护域 3.11 访问控制器 3.11.1 implies()方法 3.11.2 栈检查示例 3.11.3 一个回答“是”的栈检查 3.11.4 一个回答“不”的栈检查 3.11.5 doPrivileged()方法 3.11.6 doPrivileged()的一个无效使用 3.12 Java安全模型的不足和今后的发展 方向 3.13 和体系结构无关的安全性 3.14 资源页 第4章 网络移动性 4.1 为什么需要网络移动性 4.2 一种新的软件模式 4.3 Java体系结构对网络移动性的支持 4.4 applet:网络移动性代码的示例 4.5 Jini服务对象:网络移动对象的示例 4.5.1 Jini是什么 4.5.2 Jini如何工作 4.5.3 服务对象的优点 4.6 网络移动性:Java设计的中心 4.7 资源页 第5章 Java虚拟机 5.1 Java虚拟机是什么 5.2 Java虚拟机的生命周期 5.3 Java虚拟机的体系结构 5.3.1 数据类型 5.3.2 字长的考量 5.3.3 类装载器子系统 5.3.4 方法区 5.3.5 堆 5.3.6 程序计数器 5.3.7 Java栈 5.3.8 栈帧 5.3.9 本地方法栈 5.3.10 执行引擎 5.3.11 本地方法接口 5.4 真实机器 5.5 一个模拟:“Eternal Math” 5.6 随书光盘 5.7 资源页 第6章 Java class文件 6.1 Java class文件是什么 6.2 class文件的内容 6.3 特殊字符串 6.3.1 全限定名 6.3.2 简单名称 6.3.3 描述符 6.4 常量池 6.4.1 CONSTANT_Utf8_info表 6.4.2 CONSTANT_Integer_info表 6.4.3 CONSTANT_Float_info表 6.4.4 CONSTANT_Long_info表 6.4.5 CONSTANT_Double_info表 6.4.6 CONSTANT_Class_info表 6.4.7 CONSTANT_String_info表 6.4.8 CONSTANT_Fieldref_info表 6.4.9 CONSTANT_Methodref_info表 6.4.10 CONSTANT_InterfaceMethodref_ info表 6.4.11 CONSTANT_NameAndType_info 表 6.5 字段 6.6 方法 6.7 属性 6.7.1 属性格式 6.7.2 Code属性 6.7.3 ConstantValue属性 6.7.4 Deprecated属性 6.7.5 Exceptions属性 6.7.6 InnerClasses属性 6.7.7 LineNumberTable属性 6.7.8 LocalVariableTable属性 6.7.9 SourceFile属性 6.7.10 Synthetic属性 6.8 一个模拟:“Getting Loaded” 6.9 随书光盘 6.10 资源页 第7章 类型的生命周期 7.1 类型装载、连接与初始化 7.1.1 装载 7.1.2 验证 7.1.3 准备 7.1.4 解析 7.1.5 初始化 7.2 对象的生命周期 7.2.1 类实例化 7.2.2 垃圾收集和对象的终结 7.3 卸载类型 7.4 随书光盘 7.5 资源页 第8章 连接模型 8.1 动态连接和解析 8.1.1 解析和动态扩展 8.1.2 类装载器与双亲委派模型 8.1.3 常量池解析 8.1.4 解析CONSTANT_Class_info入口 8.1.5 解析CONSTANT_Fieldref_info 入口 S.1.6 解析CONSTANT_Methodref_info 入口 8.1.7 解析CONSTANT_Interface- Methodref_info入口 8.1.8 解析CONSTANT_String_info入口 8.1.9 解析其他类型的入口 8.1.10 装载约束 8.1.11 编译时常量解析 8.1.12 直接引用 8.1.13 _quick指令 8.1.14 示例:Salutation程序的连接 8.1.15 示例:Greet程序的动态扩展 8.1.16 使用1.1版本的用户自定义类装 载器 8.1.17 使用1.2版本的用户自定义类装 载器 8.1.18 示例:使用forName()的动态扩展 8.1.19 示例:卸载无法触及的greeter类 8.1.20 示例:类型安全性与装载约束 8.2 随书光盘 8.3 资源页 第9章 垃圾收集 9.1 为什么要使用垃圾收集 9.2 垃圾收集算法 9.3 引用计数收集器 9.4 跟踪收集器 9.5 压缩收集器 9.6 拷贝收集器 9.7 按代收集的收集器 9.8 自适应收集器 9.9 火车算法 9.9.1 车厢、火车和火车站 9.9.2 车厢收集 9.9.3 记忆集合和流行对象 9.10 终结 9.11 对象可触及性的生命周期 9.11.1 引用对象 9.11.2 可触及性状态的变化 9.11.3 缓存、规范映射和临终清理 9.12 一个模拟:“Heap of Fish” 9.12.1 分配鱼 9.12.2 设置引用 9.12.3 垃圾收集 9.12.4 压缩堆 9.13 随书光盘 9.14 资源页 第10章 栈和局部变量操作 10.1 常量入栈操作 10.2 通用栈操作 10.3 把局部变量压入栈 10.4 弹出栈顶部元素,将其赋给局部变量 10.5 wide指令 10.6 一个模拟:“Fibonacci Forever” 10.7 随书光盘 10.8 资源页 第11章 类型转换 11.1 转换操作码 11.2 一个模拟:“Conversion Diversion” 11.3 随书光盘 11.4 资源页 第12章 整数运算 12.1 二进制补码运算 12.2 Inner Int:揭示Java int类型内部性质 的applet 12.3 运算操作码 12.4 一个模拟:“Prime Time” 12.5 随书光盘 12.6 资源页 第13章 逻辑运算 13.1 逻辑操作码 13.2 一个模拟:“Logical Results” 13.3 随书光盘 13.4 资源页 第14章 浮点运算 14.1 浮点数 14.2 Inner Float:揭示Java float类型内部 性质的applet 14.3 浮点模式 14.3.1 浮点值集合 14.3.2 浮点值集的转换 14.3.3 相关规则的本质 14.4 浮点操作码 14.5 一个模拟:“Circle of Squares” 14.6 随书光盘 14.7 资源页 第15章 对象和数组 15.1 关于对象和数组的回顾 15.2 针对对象的操作码 15.3 针对数组的操作码 15.4 一个模拟:“Three—Dimensional Array” 15.5 随书光盘 15.6 资源页 第16章 控制流 16.1 条件分支 16.2 五条件分支 16.3 使用表的条件分支 16.4 一个模拟:“Saying Tomato” 16.5 随书光盘 16.6 资源页 第17章 异常 17.1 异常的抛出与捕获 17.2 异常表 17.3 一个模拟:“Play Ball!” 17.4 随书光盘 17.5 资源页 第18章 finally子句 18.1 微型子例程 18.2 不对称的调用和返回 18.3 一个模拟:“Hop Around” 18.4 随书光盘 18.5 资源页 第19章 方法的调用与返回 19.1 方法调用 19.1.1 Java方法的调用 19.1.2 本地方法的调用 19.2 方法调用的其他形式 19.3 指令invokespecial 19.3.1 指令invokespecial和[init]()方法 19.3.2 指令invokespecial和私有方法 19.3.3 指令invokespecial和super关键字 19.4 指令invokeinterface 19.5 指令的调用和速度 19.6 方法调用的实例 19.7 从方法中返回 19.8 随书光盘 19.9 资源页 第20章 线程同步 20.1 监视器 20.2 对象锁 20.3 指令集中对同步的支持 20.3.1 同步语句 20.3.2 同步方法 20.4 Object类中的协调支持 20.5 随书光盘 20.6 资源页 附录A 按操作码助记符排列的指令集 附录B 按功能排列的操作码助记符 附录C 按操作码字节值排列的操作码助 记符 附录D Java虚拟机的一个模拟:“Slices of Pi”
### 回答1: Java中的不兼容类型错误通常是由于数据类型不匹配或者类型转换不正确引起的。解决这种问题的方法包括以下几点: 1. 检查数据类型:检查数据类型是否一致,如果不一致,需要对类型进行转换或者重新定义变量类型。 2. 检查方法返回类型:如果方法返回类型与调用方的期望类型不一致,需要对方法进行修改,确保返回类型与调用方期望的类型一致。 3. 检查类型转换:如果需要进行类型转换,需要确保转换的目标类型是合法的,如果不合法会导致类型不兼容的错误。 4. 使用泛型:使用泛型可以避免一些类型不兼容的错误,因为泛型可以确保类型一致性。 5. 使用IDE:使用集成开发环境(IDE)可以更容易地检测类型不兼容的错误,IDE会自动提示可能存在的错误,可以及时发现和解决问题。 通过以上几点的检查和处理,可以有效地解决Java中的不兼容类型错误。 ### 回答2: 当在Java中遇到不兼容类型错误时,我们可以采取以下几种方法进行处理: 1. 检查类型错误:首先要仔细检查代码,查看错误所在的行以及与之相关的代码。确认是否将不兼容类型赋给了变量,或者将不兼容类型传递给了方法。在检查中,可以参考错误信息进行定位。 2. 强制类型转换:如果确定某个变量的类型,而在编译期间无法自动将其转换为兼容类型,可以使用强制类型转换。通过在变量前加上目标类型的括号,强制将其转换为指定类型。但是在进行强制类型转换时,需要注意可能会出现类型转换异常的情况,例如将无法转换的类型进行转换。 3. 重载方法:如果出现了方法参数类型不匹配的错误,可以考虑使用方法重载。在重载的方法中,根据参数类型的不同进行方法的多次定义,以实现对不同类型参数的处理和兼容。 4. 使用泛型:如果在使用集合类(如ArrayList)时遇到不兼容类型错误,可以使用泛型来指定集合中存放的元素的类型。通过指定泛型参数,确保集合中只能存放指定类型的对象,避免类型不匹配的错误。 5. 修改代码逻辑:如果在代码的设计和实现中发现了类型不兼容的存在,可能需要重新考虑代码逻辑,并进行相应的修改。例如,可以调整方法的参数类型、返回值类型或者变量的类型,以确保代码的正确运行。 总之,处理Java中的不兼容类型错误需要仔细检查代码、使用强制类型转换、重载方法、使用泛型以及修改代码逻辑。根据具体的错误情况,选择合适的处理方法,以确保代码的正确性和可靠性。 ### 回答3: 在Java中,不兼容类型错误通常是由于变量或方法的类型不匹配引起的。下面是处理这种错误的一些方法: 1. 检查变量类型:首先,确保变量的类型与其使用的地方相匹配。如果变量被声明为一个特定类型,但在其使用的地方与其他类型的对象进行操作,就会导致不兼容类型错误。可以通过检查声明变量时的类型和使用变量的地方,以确保它们是相同的类型。 2. 强制类型转换:如果出现不兼容类型错误,可以尝试使用强制类型转换来将对象转换为需要的类型。但是要注意,强制类型转换可能会导致运行时异常,因此在进行类型转换之前,应该先使用instanceof运算符检查对象是否符合目标类型。 3. 使用泛型Java提供了泛型,可以在编译时强制检查类型,以避免不兼容类型错误。通过在定义类、接口或方法时使用泛型,可以提供类型安全,减少不兼容类型错误的风险。 4. 修改方法签名:如果不兼容类型错误是由于方法参数或返回类型不匹配引起的,可以尝试修改方法签名以使其匹配。通过调整参数类型、个数或顺序,或者修改返回类型,可以消除不兼容类型错误。 5. 使用适当的包装类:有时,不兼容类型错误可能是因为试图将基本数据类型转换为包装类,或者将包装类转换为基本数据类型所引起的。在这种情况下,可以使用适当的包装类来转换类型,并避免不兼容类型错误。 总之,处理Java中的不兼容类型错误需要仔细检查变量和方法的类型匹配情况,并采取适当的措施,如强制类型转换、使用泛型或修改方法签名来解决问题。同时,要注意类型转换可能导致运行时异常,因此应该谨慎使用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值