2015-12-09 19 views
8

Tôi muốn ghi đè ràng buộc kiểu chung, nhưng tôi allways có cùng một lỗi "No implementation was bound".Tại sao tôi gặp lỗi khi cố gắng ghi đè ràng buộc chung với Guice? (TypeLiteral)

Tôi đang sử dụng roboguice 3.

Dưới đây là một ví dụ của mã mà tôi sử dụng:

public interface IParser<I, O> {} 

public class Parser1 implements IParser<String, String> { 
    IParser<String, String> mParser; 

    @Inject 
    public Parser1(IParser<String, String> parser) { 
     mParser = parser; 
    } 
} 

public class Parser2 extends Parser1 { 
    @Inject 
    public Parser2(IParser<String, String> parser) { 
     super(parser); 
    } 
} 

public class MyModule extends AbstractModule { 
    @Override 
    protected void configure() { 
     bind(new TypeLiteral<IParser<String, String>>() {}).to(new TypeLiteral<Parser1>() {}); 
    } 
} 

Và đây là sự sáng tạo injector của tôi:

RoboGuice.getOrCreateBaseApplicationInjector(this, 
       RoboGuice.DEFAULT_STAGE, 
       RoboGuice.newDefaultRoboModule(this), 
       Modules.override(new MyModule()).with(new AbstractModule() { 
        @Override 
        protected void configure() { 
         bind(new TypeLiteral<IParser<String, String>>() {}).to(new TypeLiteral<Parser2>() {}); 
        } 
       }) 
); 

Nếu tôi don' t cố gắng ghi đè lên nó (chỉ người dùng Parser1), tất cả là tốt, khi tôi ghi đè lên đối tượng tiêu chuẩn với các nhà cung cấp, nó hoạt động tốt quá, nhưng không phải với TypeLiteral.

lỗi của tôi là:

com.google.inject.CreationException: Unable to create injector, see the following errors: 
1) No implementation for IParser<String, String> was bound. 

Tôi đang làm gì sai?

Cảm ơn.

+0

Có ai có một đầu mối? Aurélien có cần cung cấp thêm thông tin không? –

+0

Tôi không thể tái tạo hành vi này theo Guice 4. Tôi sẽ lưu ý rằng có một phụ thuộc vòng tròn, mà Guice đang sử dụng một shim lớp proxy để đáp ứng. Roboguice có thể vô hiệu hoá proxy ở đâu đó không? – Cardano

+0

Lưu ý phụ: bạn không bao giờ cần 'Loại mớiLọc () {}', bạn chỉ có thể sử dụng 'ASimpleType.class' – Cardano

Trả lời

1

Tôi không shure, nhưng có vẻ đáng chú ý với tôi rằng một ràng buộc với một trường hợp conrete được sử dụng thay cho một Class:.

bind (mới TypeLiteral>() {}) đến (TypeLiteral mới() {});

bạn đã thử

bind(new TypeLiteral<IParser<String, String>>() {}).to(Parser2.class}); 

?

+0

Ràng buộc đối với thể loại chữ là tương đương với ràng buộc với lớp. – Cardano

6

Bạn nên thay đổi định nghĩa các lớp được triển khai giao diện của bạn.

Hãy thử điều này:

public class Parser1<I, O> implements IParser<I, O> { 
} 
public class Parser2<I, O> extends Parser1<I, O> { 
} 

Và sau đó bạn có thể liên kết giao diện của bạn đến lớp bằng cách này:

bind(new TypeLiteral<IParser<String, String>>() {}).to(new TypeLiteral<Parser1<String, String>() {}); 
+0

Nó không nên yêu cầu các tham số kiểu trên các lớp thực hiện, thêm chúng sẽ không ảnh hưởng đến cách Guice xử lý ràng buộc. – Cardano

+0

Trong trường hợp này, bạn sẽ nhận được "Tôi" không thể được giải quyết thành một loại trong dòng một trong những câu trả lời của bạn. Điều này thậm chí không biên dịch. – vasigorc

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