簡體   English   中英

Java-定義擴展類A和實現接口B的成員

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

您可以創建一個abstractC ,該類擴展A並實現B ,因此只需要一個界限。

abstract class C extends A implements B {}

然后:

private Class<? extends C> variable;

盡管Java不直接支持A&BA&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.

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