Đây là một ví dụ mà tôi tạo ra để đơn giản hóa mã thực sự của mình, vì vậy tôi xin lỗi nếu nó có chút ít giả tạo. Những gì tôi muốn làm là để có hiệu quả có được hai loại tham số trong một đối số kiểu lồng nhau duy nhất. Tôi khá chắc chắn điều này là không thể, nhưng tôi nghĩ rằng tôi sẽ cho nó một shot.Các tham số kiểu lồng nhau trong Java
//Not legal java code
public class Foo<C extends Collection<T>> { //where T is another type parameter
private C coll;
public Foo(C coll) {
this.coll = coll;
}
public void add(T elem){
this.coll.add(elem);
}
//UPDATED TO ADD GETTER
/**
* I may need to retrieve the collection again, or pass it
* on to another function that needs the specific C type
*/
public C getColl(){
return coll;
}
}
...
List<String> strings = new ArrayList<String>();
Foo<List<String>> foo = new Foo<List<String>>(strings);
foo.add("hello");
Tôi biết rằng tôi có thể làm điều đó bằng cách thêm một tham số kiểu:
public class Foo<C extends Collection<T>,T>
nhưng sau đó tôi phải thêm dư thừa:
Foo<List<String>,String> foo = new Foo<List<String>,String>(strings);
Và trong trường hợp thế giới thực của tôi, đôi khi generics của tôi có thể được chỉ định trong mệnh đề thực hiện như
public class Bar implements Baz<String>
Phải xác định rằng tham số loại thứ hai thậm chí còn đau hơn nữa, bởi vì nó cảm thấy như nó ném các chi tiết thực hiện trong khuôn mặt của tôi. Phải nói
Foo<Bar,String>
khi có mối quan hệ giữa Chuỗi và Bar, có vẻ như không phù hợp. Tôi nhận được rằng Java của nó, để đi với lãnh thổ, nhưng chỉ tò mò nếu có một giải pháp cho việc này.
Ý tưởng phương pháp nhà máy là thú vị, nhưng nó vẫn làm phiền tôi rằng loại được chỉ định hai lần mặc dù mã của tôi cho rằng chúng luôn giống nhau. –
@RusselLeggett, ok, vì vậy bạn cần bất biến sau đó, không có 'Bộ sưu tập super T>'? Vâng. Đó là một nỗi đau. Lời khuyên của tôi là giải quyết sự phức tạp trong thư viện của bạn và cố gắng hiển thị API terse bằng cách có các nhà máy có kiểu trả về là 'interface Foo mở rộng ComplicatedFoo , T>' để khách hàng chỉ có thể sử dụng phiên bản tham số đơn. –