2010-09-16 22 views
11

Tôi bị cám dỗ để làm loại đó của mã, sử dụng jGraphTTrong Java, có cách nào để xác định rằng một cuộc tranh cãi thực hiện hai giao diện

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

public class SteinerTreeCalc { 

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


} 

Tôi muốn tạo ra một constructor mà yêu cầu một đối tượng thực hiện hai giao diện.

Cập nhật: lớp

Trong mục tiêu của tôi, có được đã chọn cho Vertex và Edges (V và E), nhưng cảm ơn rất nhiều cho những người đưa ra:

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

Tôi giả sử bạn có lý do chính đáng để không đặt tên giao diện vừa là 'DirectedGraph' và 'WeightedGraph', để bạn có thể nhận được tất cả các bit của hợp đồng mà người dùng của' SteinerTreeCalc' được yêu cầu hỗ trợ ở một nơi? –

+0

Tốt nhất! JgraphT không cung cấp giao diện như vậy là cả DirectedGraph và WeightedGraph, và người dùng có thể không muốn sử dụng giao diện/lớp tùy chỉnh của tôi. Tôi không thực sự hiểu tại sao họ không cung cấp giao diện này. – jwinandy

Trả lời

21

Vâng, nó có thể:

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

V và E là gì? Không phải nó là SteinerTreeCalc & WeightedGraph > –

+2

Tôi cho rằng đó là một số lớp bên trong, nơi 'V' và' E' được biết đến. Nó cũng vắng mặt trong câu hỏi ban đầu. – amorfis

+0

Điều này làm cho lớp chung mặc dù. – aioobe

2

bạn có thể sử dụng kéo dài thay vì cụ trong mã trên

9

nên làm việc như thế này, nhưng đây là Generics complexer logic, hy vọng bạn có thể thích ứng:

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 
} 

Đây là những giao diện và các nhà xây dựng như được hỏi trong câu hỏi của bạn.

+0

+1: Rất giống với những gì tôi đã mã hóa. Tuy nhiên, sẽ không 'V' và' E' cư trú trên lớp chính nó và không phải trên các nhà xây dựng? Tôi cho rằng nó phụ thuộc vào mục tiêu của tác giả. –

0

Nếu VE là lớp bê tông chứ không phải là thông số loại, sau đó bạn có thể tạo một giao diện mới như sau:

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

sau đó

public class SteinerTreeCalc { 

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

Vấn đề là thực tế lập luận phải triển khai giao diện DirectedWeightedGraph. Một loại chỉ thực hiện DirectedGraph<V,E>WeightedGraph<V,E> là không đủ.

Các vấn đề liên quan