簡體   English   中英

如何使用 class 類型的方法參數?

[英]How to use class type of method parameter?

我有以下類: Foo1 擴展 Bar 和 Foo2 擴展 Bar

我想在我的方法中傳遞 Foo1 或 Foo2 的類型來創建 Foo1 或 Foo2,如下所示:

public Bar createMethod( "either type of Foo1, or Foo2" fooType) {
    
    //returns the foo1 or foo2
}

有什么方法可以實現這一目標嗎?

您可以通過聲明:

public <T extends Bar> T createMethod(Class<T> foo) {
    // do the factoring
    retrun (T) foo1 // (or foo2 depending on the foo passed);
} 

有了這個,以下所有分配都是有效的:

Bar b1 = createMethod(Foo1.class);
Bar b2 = createMethod(Foo2.class);
Foo1 f1 = createMethod(Foo1.class);
Foo2 f2 = createMethod(Foo2.class);

注意:在運行時,如果您沒有返回預期的類型,您將收到ClassCastException 因此,如果您例如這樣做:

public <T extends Bar> T createMethod(Class<T> foo) {
    return (T)new Foo2();
}

Foo1 foo1 = createMethod(Foo1.class);

這是代碼:

        public static void main(String args[]){

        Bar barB = createMethod(FooB.class);
        Bar barA = createMethod(FooA.class);

        System.out.println("barB is instance of B " + (barB instanceof FooB) );
        System.out.println("barA is instance of A " + (barA instanceof FooA) );

    }



    public static Bar createMethod(Class foo) {
        if(foo.equals(FooA.class)) {
            FooA fooA = new FooA();
            return (Bar) fooA;
        }
        else{
            FooB fooB = new FooB();
            return (Bar) fooB;
        }
    }

}

    class Bar{}
    
    class FooA extends Bar{}
    
    class FooB extends Bar{}

並且您的 FooA 和 FooB 擴展 Bar。

Java沒有聯合類型,所以像A | B A | B在 Java 中是不可能的。

Java 15 看到通過JEP 360添加了密封類型,因此您可以創建一個只有兩種無法擴展的類型的密封類型層次結構,有效地為您自己的類型模擬聯合類型。

通過傳遞Class的實例,您可以使用反射來實例化該類型。

public sealed interface FooBar permits Foo, Bar { }
public final class Bar implements FooBar { }
public final class Foo implements FooBar { }

public FooBar createMethod(Class<? extends FooBar> type) {
   return type.newInstance();
}

如果沒有密封類型,您必須接受第 3 方可能會擴展您的類型的事實,因此不僅可以將兩種類型作為方法的參數。

另一種可能性是使用字符串,並使用Class.forName(String)來獲取與完全限定的 class 關聯的類型:

public FooBar createMethod(String type) {
   if (type.equals("your.type.Foo") || type.equals("your.type.Bar"))
        return Class.forName(type).newInstance();
}

你可以聲明

public Bar createMethod(Class<? extends Bar> fooType) {
    //returns the foo1 or foo2
}

然后調用

Bar bar = createMethod(Foo1.class);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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