尝试进行类型转换,但遇到CAP#1错误

RMD*_*Dan 4 java

为即将开始的项目使用类型转换,我意外地发现了这个错误:

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的回答也提出了同样的错误.

Bri*_*ach 6

第一个问题是,你要使用实例Class一个类型的演员.那是无效的 - 它必须是一种类型.

这且不说,如果你尝试做(我已经改名myObjMyObj为清楚起见/正确命名):

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