为即将开始的项目使用类型转换,我意外地发现了这个错误:
incompatible types: Class<CAP#1> cannot be converted to myObj
where CAP#1 is a fresh type-variable:
CAP#1 extends ImyObj from capture of ? extends ImyObj
Run Code Online (Sandbox Code Playgroud)
导致此错误的代码:
ImyObj testObj = new myObj();
System.out.println(testObj.sayHi());
myObj testObj2 = (testObj.getClass()) testObj;
System.out.println(testObj2.sayBye());
Run Code Online (Sandbox Code Playgroud)
但是这很好用:
ImyObj testObj = new myObj();
System.out.println(testObj.sayHi());
myObj testObj2 = (myObj) testObj;
System.out.println(testObj2.sayBye());
Run Code Online (Sandbox Code Playgroud)
难道他们不应该做同样的事情,或者我错过了什么?我目前安装了Java 1.7_51.我已经有一段时间了,因为我沉浸在Python 2.7中,因此我接触了Java(1.7之前).
编辑:
Louis Wasserman的回答也提出了同样的错误.
第一个问题是,你要使用实例的Class一个类型的演员.那是无效的 - 它必须是一种类型.
这且不说,如果你尝试做(我已经改名myObj到MyObj为清楚起见/正确命名):
ImyObj testObj = new MyObj();
MyObj testObj2 testObj.getClass().cast(testObj);
Run Code Online (Sandbox Code Playgroud)
它不会起作用.
testObj.getClass()将返回一个Class<? extends ImyObj>"扩展ImyObject的东西".它不能用于强制转换为特定的子类; 这就是错误所说的.
如果您使用:
MyObj testObj2 = MyObj.class.cast(testObj);
Run Code Online (Sandbox Code Playgroud)
它会起作用; 你正在使用特定的课程.如果您有以下情况,情况也是如此:
MyObj mo = new MyObj();
MyObj testObj2 mo.getClass().cast(testObj);
Run Code Online (Sandbox Code Playgroud)
在这种情况下mo.getClass()返回Class<? extends MyObj>其可以被用于转换为MyObj因为目标是一个MyObj,而不是一些子类MyObj
如果testObj 不是MyObj它的实例会抛出一个java.lang.ClassCastException
| 归档时间: |
|
| 查看次数: |
5799 次 |
| 最近记录: |