2010-09-16 23 views
11

uygulayan belirtmek için bir yol yoktur Ben bir nesne ikisini uygulamak için sormak bir kurucu oluşturmak istiyorum jGraphT, bir argüman iki arabirimleri

/* 
    interface DirectedGraph<V,E> { ...} 
    interface WeightedGraph<V,E> { ...} 
*/ 

public class SteinerTreeCalc { 

    public SteinerTreeCalc(< ??? implements DirectedGraph<V,E>, WeightedGraph<V,E> > graph) { 
    ...... 
    } 


} 

kullanarak kod bu tür yapmak için cazip arabirimleri.

Güncelleme: ile gelip insanlara amacım ise

, zaten orada seçilir Vertex ve kenarları (V ve E) için sınıfları, ama çok teşekkürler:

public class SteinerTreeCalc <V, E, T extends DirectedGraph<V, E> & WeightedGraph<V, E>> 
{ 
    .... 
} 
+0

Hem "DirectedGraph" hem de "WeightedGraph" arabirimini adlandırmak için iyi bir nedeniniz olduğunu varsayalım, böylece "SteinerTreeCalc" kullanıcısı için gerekli olan tüm sözleşmeleri alabilirsiniz. tek bir yerde destek mi? –

+0

İyi bir tane! JgraphT, bir DirectedGraph ve WeightedGraph gibi bir arabirim sağlamaz ve kullanıcı özel arayüzümü/sınıflarımı kullanmak istemeyebilir. Bu arayüzü neden sağlamadıklarını anlamıyorum. – jwinandy

cevap

21

Evet, bu mümkün:

public class SteinerTreeCalc<T extends DirectedGraph<V,E> & WeightedGraph<V,E>> { 
    public SteinerTreeCalc(T graph) { 
    ...... 
    } 
} 
+0

V ve E nedir? SteinerTreeCalc & WeightedGraph > –

+2

'u kapsamaz. Bu, 'V' ve 'E' bilinen bir iç sınıf olduğunu varsayalım. Orijinal soruda da yok. – amorfis

+0

Bu sınıf jenerik olsa yapar. – aioobe

2

sen yukarıdaki kodda yerine ait uygular uzatır kullanabilirsiniz

9

böyle çalışması gerekir, ancak bu complexer jenerik mantık, sen adapte edebilir umut:

public static interface DirectedGraph<V, E> { 
} 

public static interface WeightedGraph<V, E> { 
} 

public <V, E, T extends DirectedGraph<V, E> & WeightedGraph<V, E>> SteinerTreeCalc(T bothInterfaces) { 
    // do it 
} 

Bu arabirimler ve yapıcı gibidir sorunuzda sordu. aşağıdaki gibi V ve E beton sınıfları ziyade tip parametrelerdir

+0

+1: Kodlama yaptığımma çok benziyor. Ancak, V' ve 'E', kurucu üzerinde değil, sınıfın kendisinde değil midir? Sanırım yazarın hedeflerine bağlı. –

0

, o zaman yeni bir arayüz oluşturabilir:

public interface DirectedWeightedGraph extends 
    DirectedGraph<V,E>, WeightedGraph<V,E> { 
} 
sonra

public class SteinerTreeCalc { 

    public SteinerTreeCalc(DirectedWeightedGraph graph) { 
     ... 
    } 
} 

sorun olduğunu gerçek argüman zorunluluk, DirectedWeightedGraph arabirimini uygular. Sadece DirectedGraph<V,E> ve WeightedGraph<V,E>'u uygulayan bir tür yeterli değildir.

İlgili konular