簡體   English   中英

Java轉換:如果未在要轉換的類中聲明接口,可以強制轉換到接口嗎?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM