簡體   English   中英

Java中的多個有界泛型

[英]Multiple Bounded Generics in Java

我有A類,B,C接口。 aA擴展了A,aB實現了B,cC實現了C.但是如果我嘗試使用MultipleBounded Generics,則顯示使用jdk 1.7的編譯錯誤。 請幫助我糾正錯誤。 參考鏈接

public class MultipleBounds {
    public static void main(String args[]) 
    {
      D d1 = new D();
      d1.print(new bB()); // compilation Error
      d1.print(new cC()); // compilation Error
      d1.print(new aA()); // It works no Issues
    }
}

class A {
    public void method() {
        System.out.println("methodA");
    }
}

interface B {
    public void method();
}

interface C {
    public void method();
}

class aA extends A {
    public void method() {
        System.out.println("methodaA");
    }
}

class bB implements B {
    public void method() {
        System.out.println("methodbB");
    }
}

class cC implements C {
    public void method() {
        System.out.println("methodcC");
    }
}

class D<T extends A & B & C> 
{
    public void print(T t)
    {
        t.method();
    }
}

由於您使用原始類型D來調用方法,因此該類中的所有常規信息都將丟失。 並且方法print將被其擦除代替。

現在,類型參數T的擦除是它具有的最左邊界,即A 這在JLS§4.6中很明顯:

擦除類型變量(第4.4節)是擦除其最左邊界。

因此,編譯器看到的是:

class D {
    public void print(A t)
    {
        t.method();
    }  
}

這就是為什么它適用於A而不適用於BC 課程: 避免使用原始類型。

問題在這里: D d1 = new D(); 您正在使用原始類型,因此會丟失泛型信息。 並且類型交集A & B & C的類型擦除是其第一個成分A )。 因此,您的d1只接受A

例如,如果將其重新排序為B & A & C ,則只能傳遞B

最后請注意,您將無法使用泛型聲明D因為代碼中沒有類是AB以及C 您可以創建一個class ABC extends A implements B, C並使用D<ABC> d = new D<>();

暫無
暫無

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

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