[英]Java casting: can you force a cast to a interface if it's not declared in the to be casted class?
我想這是不可能的,但是我想知道:
您可以將符合特定接口方法的類強制轉換為該方法的類(但不使用“實現接口”)嗎?
任何解決方法? 我想為某個類使用包裝器類,但是無法訪問其構造函數,也無法修改期望該類的接收代碼。
-編輯-對不起,我不清楚界面。 實際上是兩個思路合並為一個問題的人。 我應該問過有關將一個班級轉換為另一個班級的問題。
簡短的答案是沒有。 系統怎么可能知道? 充其量只是巧合。
現在就解決方法而言,反射是您的朋友。 Oracle教程
示例代碼:
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Member;
import static java.lang.System.out;
enum ClassMember { CONSTRUCTOR, FIELD, METHOD, CLASS, ALL }
public class ClassSpy {
public static void main(String... args) {
try {
Class<?> c = Class.forName(args[0]);
out.format("Class:%n %s%n%n", c.getCanonicalName());
Package p = c.getPackage();
out.format("Package:%n %s%n%n",
(p != null ? p.getName() : "-- No Package --"));
for (int i = 1; i < args.length; i++) {
switch (ClassMember.valueOf(args[i])) {
case CONSTRUCTOR:
printMembers(c.getConstructors(), "Constructor");
break;
case FIELD:
printMembers(c.getFields(), "Fields");
break;
case METHOD:
printMembers(c.getMethods(), "Methods");
break;
case CLASS:
printClasses(c);
break;
case ALL:
printMembers(c.getConstructors(), "Constuctors");
printMembers(c.getFields(), "Fields");
printMembers(c.getMethods(), "Methods");
printClasses(c);
break;
default:
assert false;
}
}
// production code should handle these exceptions more gracefully
} catch (ClassNotFoundException x) {
x.printStackTrace();
}
}
不,您不能這樣做,因為其他海報已經回答了。
對於(丑陋的)解決方法:可以使用java.lang.Reflection
來訪問任何構造方法,甚至是私有的。
通過反射通過私有no-arg構造函數實例化對象的示例:
java.lang.reflect.Constructor[] c = clazz.getDeclaredConstructors();
c[0].setAccessible(true);
Object instance = c[0].newInstance(new Object[] {});
但是請注意,我一生中曾經看到過(通過SecurityManager)配置的VM,因此無法通過反射訪問私有字段。
您不能將對象引用轉換為不在該對象的繼承鏈中的類,也不能轉換為該對象未實現的接口。 有一個運行時檢查會阻止這種情況。
(當涉及強制轉換引用數組時,它的限制更加嚴格。)
否,但是您可以使用適配器設計模式解決此問題。 創建一個實現該接口的類,並將該類的實例作為構造函數參數。 然后將所有方法委托給該實例。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.