2017-01-26 36 views
2

Я сделал некоторые вещи:Дженерики простираются без расширения - как сделать

class Tuple1<T1, T2> { 
    private T1 a; 
    private T2 b; 

    public Tuple1(T1 a, T2 b) { 
     this.a = a; 
     this.b = b; 
    } 

    public T1 getA() { 
     return a; 
    } 

    public T2 getB() { 
     return b; 
    } 

    @Override 
    public String toString() { 
     return "[" + a.toString() + ", " + b.toString() + "]"; 
    } 
} 

Теперь я должен сделать Tuple2 (а, Ь + с поля) и Tuple3 (а, b, c + d поле), который будет иметь те же функции, что и Tuple1, но без extends и без избыточности кода.

+1

Интересные работы домой. Есть идеи, как решить эту проблему? – GhostCat

+0

Ваше текущее использование также не распространяется. И что вы подразумеваете под избыточным кодом - для повторного использования Tuple1 в конструкции Tuple2? – ucsunil

+0

Вы можете взглянуть на исходный код библиотеки jOOλ, который реализует что-то очень похожее на то, что вы пытаетесь сделать: http://www.jooq.org/products/jOO%CE%BB/javadoc/0.9 .12/org/jooq/lambda/tuple/package-summary.html – Henrik

ответ

2

Вы могли бы рассмотреть следующее решение:

class Tuple<T1, T2> 
{ 
    private T1 a; 
    private T2 b; 

    public Tuple1(T1 a, T2 b) 
    { 
     this.a = a; 
     this.b = b; 
    } 

    public T1 getA() { return a; } 

    public T2 getB() { return b; } 

    @Override 
    public String toString() 
    { 
     return "[" + a.toString() + ", " + b.toString() + "]"; 
    } 
} 

class Tuple2<T1, T2, T3> 
{ 
    private Tuple1<T1, T2> tuple; 
    private T3 c; 

    public Tuple2(T1 a, T2 b, T3 c) 
    { 
     this.tuple = new Tuple1<T1, T2>(a, b); 
     this.c = c; 
    } 

    public T1 getA() { return tuple.getA(); } 

    public T2 getB() { return tuple.getB(); } 

    public T3 getC() { return c; } 

    @Override 
    public String toString() 
    { 
     return "[" + getA().toString() + ", " + getB().toString() + ", " + c.toString() + "]"; 
    } 
} 

class Tuple3<T1, T2, T3, T4> 
{ 
    private Tuple2<T1, T2, T3> tuple; 
    private T4 d; 

    public Tuple3(T1 a, T2 b, T3 c, T4 d) 
    { 
     this.tuple = new Tuple2<T1, T2, T3>(a, b, c); 
     this.d = d; 
    } 

    public T1 getA() { return tuple.getA(); } 

    public T2 getB() { return tuple.getB(); } 

    public T3 getC() { return tuple.getC(); } 

    public T4 getD() { return d; } 

    @Override 
    public String toString() 
    { 
     return "[" + getA().toString() + ", " + getB().toString() + ", " + getC().toString() + ", " + d.toString() + "]"; 
    } 
} 
3

Вы можете создать несколько конструктор, который может сделать, что вы хотите:

, например:

private T1 a; 
private T2 b; 
//create a new attribute 
private T2 c; 

//constructor with two attributes 
public Tuple1(T1 a, T2 b) { 
    this.a = a; 
    this.b = b; 
} 

//constructor with three attributes 
public Tuple1(T1 a, T2 b, T2 c) { 
    this.a = a; 
    this.b = b; 
    this.c = c; 
} 

//getters and setters of your attributes 

Итак, когда вы хотите использовать два атрибута:

Tuple1 t1 = new Tuple1(a, b); 

Итак, когда вы хотите использовать три атрибута:

Tuple1 t2 = new Tuple1(a, b, c); 

Вы можете узнать больше в этом Oracle учебнике: Getting Started

и о constructors и here

Надеется, что это может помочь вам.

+0

Спасибо, но Tuple2 и Tuple3 должны быть классом. – hqid

+1

@hqid, да, тогда вы можете создавать классы с разными конструкторами, как я делаю раньше –

2

Вы можете сделать Tuple2<T1, T2, T3> и подобные им для Tuple3. Вы должны сохранить Tuple1<T1, T2> как частное поле внутри Tuple2 вместе с T3 c и реализовать все необходимые методы, причем некоторые из них просто делегируют свои вызовы соответствующим методам Tuple1. Может показаться, что это избыточно, но вам нужно объявить метод, чтобы назвать его, поэтому избежать этого невозможно.

 Смежные вопросы

  • Нет связанных вопросов^_^