簡體   English   中英

java泛型類擴展了泛型參數

[英]java generic class extends the generic argument

簡潔版本:

使類擴展其泛型參數的正確語法是什么:

 class A<T> extends T {} // doesn't compile

長版:

我有一個基本抽象類(以下代碼已縮短,僅用於此帖子目的)

abstract class D { 
     abstract void f();
     abstract void g();
}

然后,每個f()和每個g()都有一組可能的組合。 目標是擁有所有可能的組合。

一種解決方案是為每個f_j()創建一個擴展D的類Fj並實現f_j(),然后對於每個g_i(),我們創建一個擴展Fj並實現g_i()的類GiFj。 例如

abstract class F1 extends D {
    @Override
    void f() { /* F1 Work */ }
}
abstract class F2 extends D {
    @Override
    void f() { /* F2 Work */ }
}
class G1F1 extends F1 {
    @Override
    void g() { /* G1 Work */ }
}
class G1F2 extends F2 {
    @Override
    void g() { /* G1 Work : Duplicated Code */ }
}

問題是Gi的代碼會多次重復。

我想要實現的解決方案是將所有GFi重組為泛型類

class G1<F extends D> extends F {
    @Override
    void g() { /* G1 work */ }
}

那么如何在java中做到這一點,或者如果不可能做到這一點的好方法

回答短版本

這在Java中是不可能的。 編譯器需要在編譯時知道類的超類具有哪些方法和字段。 因此,類只能擴展具體類(可能使用類型變量),但它不能自己擴展類型變量。

回答長版本(表面上似乎與短版本無關)

您可以使用合成來實現您想要的類型:

class Foo {
    final FDelegate fDelegate;
    final GDelegate gDelegate;

    Foo(FDelegate fDelegate, Delegate gDelegate) {
        this.fDelegate = fDelegate;
        this.gDelegate = gDelegate;
    }

    void f() {
        fDelegate.f(this);
    }

    void g() {
        gDelegate.g(this);
    }
}

interface FDelegate {
    void f(Foo container);
}
interface GDelegate {
    void g(Foo container);
}

然后你有F1F2G1G2類,它們包含各種方法實現。 您傳遞一個Foo對象,以便您可以訪問其(可見)成員。

暫無
暫無

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

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