2016-12-17 15 views
5

Đây là một ví dụ giả tạo, nhưng đơn giản hơn để giải thích hơn so với mã thực tế của tôi:Có cách nào để tránh lặp lại các thông số loại chung khi một loại có thể được suy ra từ cái kia không?

public interface ContainerOwner<T, C extends Container<T>> { 
    // ... 
} 

tôi muốn tránh sự lặp lại của T ở chỗ loại chữ ký vì nó trở nên khó sử dụng khi các thông số mình có tham số, cho ví dụ:

ContainerOwner< 
    Optional<Future<Map<String, Integer>>>, 
    List<Optional<Future<Map<String, Integer>>>> 
> foo; 

Trong ví dụ này, tôi cảm thấy tham số đầu tiên có thể được suy ra từ lần thứ hai. Có một mẹo để làm điều đó?

+1

như thế nào bạn sử dụng các loại? – Bohemian

+0

@Bohemian Tôi không hoàn toàn chắc chắn ý bạn là gì với câu hỏi của bạn. –

+0

Hiển thị mã sử dụng các loại. Có lẽ bạn không cần loại (s)! – Bohemian

Trả lời

2

Một cách có thể được sử dụng một tiểu giao diện cụ thể hơn sẽ cần chỉ có một tham số loại, một cái gì đó như:

public interface ListOwner<T> extends ContainerOwner<T, List<T>> { 
} 

Sau đó, mã của bạn sẽ là:

ListOwner<Optional<Future<Map<String, Integer>>>> foo; 
+0

Cảm ơn. Trong nhiều trường hợp, điều này sẽ hoạt động, nhưng nó hoàn toàn bị ràng buộc: 'ListOwner ' là một kiểu con của kiểu mà tôi muốn, không phải là một bí danh cho nó. Tôi đã tìm kiếm một giải pháp tương tự như loại bí danh trong Rust hoặc Haskell, hoặc một cái gì đó như bạn có thể nhận được với phụ thuộc chức năng Haskell, mà Rust có thể gần đúng với các loại liên quan. Dường như [Scala có một số hỗ trợ cho các phụ thuộc chức năng] (https://milessabin.com/blog/2011/07/16/fundeps-in-scala/) vì vậy tôi có thể sẽ thử thay vào đó. –

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