2013-01-14 20 views
1

我有2个不同的类。一个是通用的valueHolder,它可以包含任何扩展数字的东西。使用通用类型的嵌入式泛型

class ValueHolder<T extends number>{ 
    private T currentValue; 

    //more functions, database logic, etc... 
} 

其他类更复杂,并且具有“targetValue”。此外它的参数是这样的:

class MoreComplexClass<T extends ValueHolder<?>> 
    private T valueHolder; 
    private XXX requiredValue; 

    //a lot more functions. 
} 

是它“可能”使用而ValueHolder的键入MoreComplexClass的requiredValue? 我想要实现的是:Beeing能够将currentValue和requiredValue与> <进行比较,而不需要进行铸造并且不会丢失Typesafety。 (也许我也想办法复杂achiee本)

回答

3

答案是肯定的,你可以声明复杂类这样:

class MoreComplexClass<N extends Number, T extends ValueHolder<N>> 
    private T valueHolder; 
    private N requiredValue; 

    //a lot more functions. 
} 

但由于您使用的是Number类,您将无法使用这些操作员,您需要使用Number类的XXXvalue()方法之一(即:doubleValue(),longValue())才能使用这些操作员。

+0

完美,那就是我在找。现在我只想考虑它是否对我有帮助,或者如果它使工作变得更加困难:-) – dognose

+0

不幸的是,不是数字实现可比较,但派生的子类,如Integer,Double,...因此,目前没有改变用法,除了现在保存,valueHolder和ComplexClass具有相同的类型。 – dognose

+0

对不起,我做出了这个假设,现在就纠正了。正如你所说,至少你的代码更安全,因为它鼓励在'ValueHolder'和'ComplexClass'中使用相同的类型,为了进行比较,我会将值转换为'double',因为它是更高精度的值 –

0

由于意见,我做了一些改动,现在看起来是这样的:

public class ValueHolder<T extends Comparable<T>> { 
private T currentValue; 

public T getCurrentValue() { 
    return currentValue; 
} 

public void setCurrentValue(T currentValue) { 
    this.currentValue = currentValue; 
} 
} 

public class MoreComplexClass<N extends Comparable<N>, T extends ValueHolder<N>> { 
private T valueHolder; 
private N requiredValue; 

public N getRequiredValue() { 
    return requiredValue; 
} 

public void setRequiredValue(N requiredValue) { 
    this.requiredValue = requiredValue; 
} 

public T getValueHolder() { 
    return valueHolder; 
} 

public void setValueHolder(T valueHolder) { 
    this.valueHolder = valueHolder; 
} 
} 

现在,我能够做的比较以通用的方式,太(这是essentiell,因为我不要投射到每一个可能的类型在一个旁注,这将现在的日期等工作,太):

public class Main { 
public static void main(String[] args) { 

    ValueHolder<Long> longHolder = new ValueHolder<>(); 
    longHolder.setCurrentValue(2L); 

    MoreComplexClass<Long, ValueHolder<Long>> mcc = new MoreComplexClass<>(); 
    mcc.setRequiredValue(1L); 

    int compare = mcc.getRequiredValue().compareTo(mcc.getValueHolder().getCurrentValue()); 

    if (compare < 0) { 

    } else if (compare > 0) { 

    }else{ 

    } 
} 
} 

我会离开你的解决方案蜱指着我在正确的方向;)