依赖

2014-03-04 55 views
0

我有以下接口:依赖

public interface Assembler<T, S> { 
    S assemble(T val); 
} 

public interface Slicer<T, V> { 
    V[] slice(T val); 
} 

我想有一个汇编程序实例中使用切片器实例,并调用它的切片()。我有以下几点:

public class MyAssembler<T, S> implements Assembler<T, S> { 

    private final Slicer<T, V> slicer; 

    //ctor 
    public MyAssembler() { 
    slicer = new MySlicer<T, V>(); 
    } 

    @Override 
    public S assemble(T val) {   
     V[] v = mySlicer.slice(val); 
    } 

这不会编译,因为V形不知道(不能被解析为一个类型)在MyAssembler。我无法将汇编器接口更改为Assembler<T, S, V>。有另一种方法可以定义依赖关系吗?这不是非泛型类的问题。即使使用静态工厂方法来获得切片机的参考,未知V的问题仍然存在。有什么建议么?如果不能这样做,任何人都可以推荐一种不同的方法或设计模式,以允许汇编程序调用切片器的slice()?

+0

您可以为'MyAssembler'声明第三个类型变量。 –

+0

我尝试过使用'MyAssembler '。它会编译,但是一旦尝试实例化,例如:汇编器 asmblr = new MyAssembler ,则编译失败:汇编器类型参数的数量不正确;它不能用参数进行参数化。 – pjscore10

+0

第三个类型参数对于'MyAssembler'是必需的,而不是声明类型'Assembler'。但在这里看起来并不是很有用,因为你不用'V'做任何事情。 –

回答

0

重新发布Sotirios Delimanolis的评论作为答案。

要允许在MyAssembler中使用V,请声明MyAssembler<T, S, V> extends Assembler<T, S>。要使用它,请使用例如:Assembler<Integer, Integer> asmblr = new MyAssembler<Integer, Integer, Integer>进行实例化。

0

继承将解决你的问题,而不是组成在这种情况下,如下图所示:

public class MyAssembler<T,S,V> extends MySlicer<T,V> implements Assembler<T,S> { 

    public MyAssembler() { 
    } 

    @Override 
    public S assemble(T val) { 
     V[] v = this.slice(val); 
     ... 
    } 
} 
0

将汇编总是有切片机作为其两个仿制药之一?如果是这样,您只需要定义一个泛型,并将Slicer作为非泛型成员变量。

但是,如果通用类型可能会或可能不会是切片机,可以实现对特殊的处理时,其中之一是切片机与反思,尤其是if (v instanceof Slicer)如果为true,则铸造切片。

+0

切片器不会是汇编器中的通用类型T或S之一。 – pjscore10

0

由于您的SV是通用的,您可以将它们换成任何其他类型,甚至是其他类型。你可以这样做:

public class MyAssembler<T, S> implements Assembler<T, S> { 

    private final Slicer<T, S> slicer; 

    public MyAssembler() { 
     slicer = new MySlicer<T, S>(); 
    } 

    @Override 
    public S assemble(T val) { 
     S[] v = slicer.slice(val); 
     return v[0]; // for example 
    } 
} 

我所做的是确定TS为同一类型。在我自己的实施中,我可以毫无问题地做到这一点。

+0

这可能会工作,假设类型将永远是相同的,但是这不限制S和原来的V现在是相同的类型?可能希望组件S是字符串,切片器V是整数。 – pjscore10

+0

确实。但正如你所指出的那样,汇编程序将*调用切片机的切片()*。如果S和V类型不同,你不能保证任何东西。你想如何将'V'投向'S'?通过调用'slice'你有'V',但在'assemble'里面你想返回'S'。如果你想支持任意类型,你不能这样做。但是:如我的例子所示,你不能选择切片机的类型。它将由汇编器的类型决定。由于切片机封装良好,因此您甚至不会知道组装者背后的工作。您只需使用像黑盒子那样的Assembler。 – exception1

+0

我觉得现在在汇编语言中使用V更为灵活:'MyAssembler 扩展了汇编器'。 – pjscore10