![](/img/trans.png)
[英]How to use class type passed as parameter to method to define local variables
[英]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.