2010-12-12 32 views
5

Tôi đang viết một số lớp bằng Generics nhưng tôi không thể tìm thấy giải pháp cho lớp SolutionSubset và vì vậy tôi nhận được thông số lỗi " S không nằm trong giới hạn của nó ". Tôi đã đọc các câu hỏi trước về cùng một lỗi nhưng tôi không thể giải quyết vấn đề này cho trường hợp của mình. Ai có thể giúp tôi cải thiện kiến ​​thức về Generics của tôi? Mọi tham chiếu cho sách hay (tôi có thể tìm thấy trong google nhiều thông tin nhưng nếu ai đó có thể giới thiệu sách, hướng dẫn, v.v. sẽ được chào đón). Mặc dù tôi đã cố gắng ghi nhớ các quy tắc đặt câu hỏi nhưng tôi xin lỗi nếu câu hỏi của tôi không đáp ứng các quy tắc này.Về lỗi khi sử dụng Java generics: "type parameter S không nằm trong giới hạn"

Tôi có các lớp và các giao diện sau:

 


public interface Subset<T extends Comparable<T>> extends Comparable<Subset<T>> 
public class MathSubset<T extends Comparable<T>> extends TreeSet<T> implements Subset<T> 

public interface Solution<T extends Comparable<T>> 

public interface Solutions<S extends Solution<?>> extends Iterable<S> 
public class SolutionsSubset<S extends Solution<?>> extends MathSubset<S> implements Solutions<S> 

 

Tôi cần điều đó tập hợp con mở rộng năng tương đương. Trong SolutionsSubset, lớp MathSubset lưu trữ các đối tượng Solution. Làm cách nào để thay đổi định nghĩa này để làm cho nó hoạt động?

Cảm ơn bạn trước

Trả lời

1

Trước hết, đây là lỗi đầy đủ (mà là cụ thể cho MathSubset không nhận được một thông số thích hợp): Bound mismatch: The type S is not a valid substitute for the bounded parameter <T extends Comparable<T>> of the type QifFixer.MathSubset<T>

Vấn đề là MathSubset hy vọng một <T extends Comparable<T>, nhưng bạn đang cung cấp cho nó S extends Solution<?> - những loại đó không liên quan gì đến nhau, bởi vì Giải pháp không kế thừa hoặc triển khai Comparable<T>.

Nếu bất cứ điều gì, bạn có thể thử này:

public class SolutionsSubset<S extends Comparable<S>> extends 
    MathSubset<S> implements Solutions<Solution<S>>; 

Thật không may, điều này sẽ VẪN không hoạt động vì MathSubset thực hiện Iterable, nhưng như vậy không Solutions.

Một sửa chữa dễ dàng sẽ là giải pháp không mở rộng Iterable, nhưng nó thực sự âm thanh với tôi như bạn đang cố gắng sử dụng một cách tiếp cận phức tạp hơn bạn cần. Có thể là "has-a" thay vì "is-a" thiết kế có thể có lợi hơn ở đây?

+0

Cảm ơn sự giúp đỡ của bạn; Cuối cùng tôi quyết định chuyển sang thiết kế "có một". Dù sao, giải pháp của bạn đã giúp tôi hiểu theo cách tốt hơn Generics in Java – user539694

1

Generics là thứ có thể nhanh chóng thoát ra khỏi tay, đặc biệt là nếu bạn cố gắng "tất cả chung chung" cùng một lúc. Càng đơn giản càng đẹp. Điều gì luôn giúp tôi là bắt đầu cụ thể (bao gồm cả việc thực hiện) và sau đó từ từ thay thế các tham số chung trong, một tham số và lớp tại một thời điểm.

Ai đó có thể giúp tôi cải thiện kiến ​​thức về Generics của tôi?

http://www.angelikalanger.com/GenericsFAQ/JavaGenericsFAQ.html

Không phải là một hướng dẫn, nhưng rất nhiều thông tin hữu ích. Đó là một trong những tài liệu tham khảo mà bạn đọc những phần bạn có thể hiểu được, nhưng hãy quay trở lại lặp đi lặp lại trong tương lai khi bạn đạt được nhiều hơn làm chủ và nhiều hơn nữa bắt đầu có ý nghĩa.

+0

Cảm ơn bạn rất nhiều. Đây là một trang web rất hay về Java và Generics. – user539694

6

Để được sử dụng làm đối số loại trong MathSubset, SolutionsSubset s S phải extend Comparable<S>. Là ví dụ có thể biên dịch:

import java.util.TreeSet; 

interface Subset<T extends Comparable<T>> 
    extends Comparable<Subset<T>> { } 

class MathSubset<T extends Comparable<T>> 
    extends TreeSet<T> 
    implements Subset<T> 
{ 
    public int compareTo(Subset<T> other) { throw new Error(); } 
} 

interface Solution<T extends Comparable<T>> { } 

interface Solutions<S extends Solution<?>> extends Iterable<S> { } 

class SolutionsSubset<S extends Solution<?> & Comparable<S>> 
    extends MathSubset<S> 
    implements Solutions<S> 
{ } 

Một vài nhận xét: Đây là ví dụ rất trừu tượng và do đó không dễ nghĩ đến. Đặt ra mã để bạn không cần phải cuộn là tốt.Có rất nhiều di sản khủng khiếp đang diễn ra ở đây, có lẽ sáng tác hơn là, giả sử, mở rộng TreeSet. Rất khó để phân biệt giữa số nhận dạng SolutionsSolution.

+0

Cảm ơn. Giải pháp của bạn là thú vị mặc dù cuối cùng tôi đã thay đổi thiết kế để làm cho nó đơn giản hơn. – user539694

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