[英]Java - Defining a member that extends class A and implements interface B
我有一個必須滿足兩個條件的變量,我想在定義中設置它們
我知道我可以使用單個變量定義任一條件,就像這些示例中的任何一個一樣
private Class<? extends A> variable; //or
private A variable; //or
private Class<? extends B> variable; //or
private B variable;
但是有辦法讓變量同時滿足兩個條件嗎?
我希望有這樣的東西
private Class<? extends A implements B> variable;
但是當我需要調用它或存儲它的多個副本時,如果沒有類型轉換,我找不到任何方法
您可以聲明具有多個界限的類型參數,例如:
public static <T extends A & B> void test(Class<T> clazz)
但是您不能聲明具有多個邊界的變量:
private Class<? extends A & B> variable; // doesn't work
您可以創建一個abstract
類C
,該類擴展A
並實現B
,因此只需要一個界限。
abstract class C extends A implements B {}
然后:
private Class<? extends C> variable;
盡管Java不直接支持A&B
類A&B
交集類型,但此類類型的確會出現在類型參數范圍內並捕獲轉換。 我們可以用抽象層來表達A&B
。
public class ValueAB<T extends A&B>
{
public final T v;
// constructor ...
}
public class ClassAB<T extends A&B>
{
public final Class<T> clazz;
// constructor ...
}
代替A&B, Class<? extends A&B>
A&B, Class<? extends A&B>
,我們使用包裝器ValueAB, ClassAB
ClassAB<?> clazz = new ClassAB<>(Foo.class);
ValueAB<?> value = new ValueAB<>(clazz.c.newInstance());
value.v.methodOfA();
value.v.methodOfB();
該解決方案將需要針對As和B的每種組合使用包裝器。
另一種解決方案是僅使用A
作為類型參數綁定; B
將由通配符綁定提供。 如果您需要在使用現場表達多種A&B1, A&B2, ...
類型,可能會更好。
public class ValueA<T extends A>
{
public final T v;
...
}
public class ClassA<T extends A>
{
public final Class<T> c;
...
}
---
ClassA<? extends B> clazz = new ClassA<>(Foo.class);
ValueA<? extends B> value = new ValueA<>(clazz.c.newInstance());
如果在這種情況下混淆通配符的工作方式,請參閱我的通配符文章
在包裝的聲明位置,第三個解決方案不含A或B; 使用站點提供A和B。
public class Value<T extends S, S>
{
public final T v;
...
}
public class Clazz<T extends S, S>
{
public final Class<T> c;
...
}
---
Clazz<? extends A, B> clazz = new Clazz<>(Foo.class);
Value<? extends A, B> value = new Value<>(clazz.c.newInstance());
但是,這可能太令人困惑了。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.