2016-08-31 6 views
1

ジェネリック型をロックダウンする際に問題があります。以下は、2つの列挙型クラスによって実装されるインタフェースです。 Coverクラスは、CarRequestクラスで指定されているジェネリック型を使用しています。 CoverTypeインターフェイスを実装している列挙型のみを使用できるようにしたいと考えています。まずenumであるジェネリック型をロックする方法

私は、列挙型と使用によって拡張された抽象クラスを使用するのではと思った:

public class Cover<T extends AbstractCoverType> 

しかし、それは動作しません、私は列挙型クラスを拡張することはできませんので。私は、その場合にはしかし、以下に示すインタフェース・ソリューションを考えていたよりも私は行うことはできません。

public class Cover<T implements CoverType> 

を、私は最初の二つの列挙型ではなく第三ジェネリック型として受け入れるだけにCoverクラスをロックダウンすることができますどのように?

インタフェース:

public interface CoverType {} 

まず列挙:

public enum FireCoverType implements CoverType { 
    SANITATION, RENTAL, GLASS 
} 

第二に列挙:

public enum CarCoverType implements CoverType { 
    ACCESSORIES, LEGAL_ASSISTANCE 
} 

第三に列挙:

public enum PaymentTerm { 
    MONTH, QUARTER, YEAR 
} 

カバークラス:

public class Cover<T> { 
    private T coverType; 
    // getter and setter 
} 

CarRequest:

public class CarRequest { 
    private Cover<CarCoverType> cover; 
    // getter and setter 
} 

答えて

6

使用extendsあなたのジェネリック型定義を結合に関係なく、クラスやインタフェースのかどうかの。

つまり、汎用タイプの上位バインディングにはimplementsがありません。extendsは、クラスとインターフェイスの両方で機能します。だから、

public class Cover<T extends CoverType>

... CoverTypeはあなたの列挙型が実装するインタフェースであるあなたが探しているソリューションは、です。 documentationから

:[...] extendsを意味するように一般的な意味で使用されていることを

注いずれか(インタフェースのように)(クラスのように)「延び」または「用具」。

enumも暗黙のうちにjava.lang.Enumを拡張しているので、クラスを拡張することはできません。

+0

時々、答えは本当に簡単です。私を助けてくれてありがとう! –

+0

@MartijnBurger確かに:)あなたは大歓迎です! – Mena

関連する問題