2016-08-31 3 views
1

Ich habe ein Problem beim Sperren eines generischen Typs. Unten ist eine Schnittstelle, die von zwei Enum-Klassen implementiert wird. Die Klasse Cover verwendet einen generischen Typ, der in einer Klasse CarRequest angegeben ist. Ich möchte in der Lage sein, nur die Enums zu verwenden, die die CoverType Schnittstelle implementieren.So sperren Sie einen generischen Typ, der eine Enum ist

Zuerst dachte ich, eine abstrakte Klasse zu verwenden, die durch die Aufzählungen und Nutzung erweitert:

public class Cover<T extends AbstractCoverType> 

Aber das funktioniert nicht, weil ich nicht eine ENUM-Klasse erweitern kann. Als ich von der Schnittstellenlösung gedacht, die im Folgenden dargestellt wird, aber in diesem Fall kann ich nicht tun:

public class Cover<T implements CoverType> 

Wie kann ich die Cover Klasse nur als Gattungstyp die ersten beiden Aufzählungen zu akzeptieren sperren und nicht die dritte ?

Schnittstelle:

public interface CoverType {} 

Erste Enum:

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

Zweite Enum:

public enum CarCoverType implements CoverType { 
    ACCESSORIES, LEGAL_ASSISTANCE 
} 

Dritte Enum:

public enum PaymentTerm { 
    MONTH, QUARTER, YEAR 
} 

Titel Klasse:

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

CarRequest:

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

Antwort

6

Verwenden extends wenn Ihre generische Typdefinition verbindlich, unabhängig davon, ob es sich um eine Klasse oder eine Schnittstelle.

Mit anderen Worten, es gibt keine implements im generischen Typ obere Bindung - extends funktioniert für Klassen und Schnittstellen.

So:

public class Cover<T extends CoverType>

... ist die Lösung, die Sie suchen, wo CoverType ist die Schnittstelle Ihre Aufzählungen implementieren.

Vom documentation:

Beachten Sie, dass [...] extends in einem allgemeinen Sinne verwendet wird, bedeutet entweder "erstreckt" (wie in Klassen) oder "Geräte" (wie in Schnittstellen).

auch erwähnenswert, enum s können Klassen nicht verlängern, da sie java.lang.Enum implizit bereits erweitern.

+0

Manchmal kann die Antwort sehr einfach sein. Danke, dass du mich gerettet hast! –

+0

@MartijnBurger in der Tat :) Gern geschehen! – Mena

Verwandte Themen