2013-01-07 28 views
5

kısıtlayabilirsiniz? Yani Örneğin, String ya da int ya da double olabilir. Mümkün mü?nasıl Aşağıdaki kod var Java Jenerik

P.S.

kullanmak istediğim yok

protected <T extends String> T getValueForKey(String key) { 

} 

Sadece Dizeler olmasını istemiyorlar ..

+2

Not: Dize nihayet olduğu için == = 'dir. – assylias

+1

Korumalı T getValueForKey (String tuşu, Sınıf resultClass) .. getValue ... öğesini çağırırken dönüş türünü ayarla ... – anfy2002us

+1

Bir giriş değerini kısıtlıyor olsaydınız, sadece birkaç farklı aşırı yükleme kullanabilirsiniz; çıkışı kısıtlıyor. –

cevap

6

ben farklı bir erişim yöntemine sahip olmak öneririm dönüş değeri aşırı olamayacağına göre:

protected int  getIntForKey(String key); 
protected double getDoubleForKey(String key); 
protected String getStringForKey(String key); 
2
Ben sadece String genel bir tür kısıtlamak için bir yol yoktur sanmıyorum

, Tamsayı ve Çift, ancak <T extends Comparable> Dize, Tamsayı ve Double tüm karşılaştırılabilir özelliklerini kullanabilirsiniz. Ama diğer birçok sınıf en ayrıca java.util.Date gibi Karşılaştırılabilir uygulamak, sana dönmek "Bir dize veya bir tamsayı veya bir çift" vb olabilir zaten bilmiyorum

+0

Bu, diğer birçok türe de izin verecektir (örneğin Tarih). Bunun sorulması gereken bir şey olduğunu düşünmüyorum. – assylias

+0

@assylias true, ama bunun yerine jenerics kullanarak başka bir yaklaşım var mıdır? – PermGenError

+0

Hayır, daha uygun bir cevap olacağını düşünmüyorum ;-) – assylias

1
protected <T extends Object> T getValueForKey(String key); 

Yapabilirsin Döndürülen nesnenin sınıf adını kontrol etmek ve döndürülen nesne istediğiniz türden biri değilse bir istisna atmak için her zaman bir mantık ekleyin.

+0

Bu yaklaşımın türü güvenliği kaybetme tehlikesi değil midir? –

+0

Güncelleniyor T uzantıları Object – cowls

0

Bunu yapmak için doğrudan bir yol yoktur.
T türünde kullanılan sınıfların, kısıtlı olması için ortak bir şeyleri olması gerekir, I.E. T hepsi sınıflar bazı arabirimini uygulamak zorunda - bu varsayalım InterfaceName

class SinifAdi şöyle protected T getValueForKey(String key) içeren sınıf, daha sonra sınıf ClassName beyan etmek zorunda ise:

class ClassName<T extends InterfaceName> 

Çok benzer bir soru zaten bu URL'den istendi:

How to restrict types which are allowed as "T" in a generic class?

+0

Daha spesifik olabilir misiniz? –

+0

Bir kısıtlamaya sahip olmak için T türlerinin hepsinin ortak bir arayüz oluşturması gerekiyor - bunların hepsinin uyguladığı bir çeşit arayüz var mı? (Hatta, T'nin virgülle ayrılmış bir liste kullanarak birden fazla arabirimi uygulamasını gerektirebilir) –

0

@ anfy2002us ait yorumunu yineleyen - bu ca için sorun olmazsa Verilen anahtarla ilişkili değerin istenen türünü bilmek, buna ne dersin?

protected <T> T getValueForKey(String key, Class<T> type) { 
    return currentStats.containsKey(key) ? type.cast(currentStats.get(key)) : null; 
}