2013-09-06 4 views
1

Я пытаюсь использовать guava для создания сопоставимого места, где мне нужно только одно поле класса (используется коллекцией для сортировки). Это поле является общим и может принимать любой тип. Я использую метод упорядочения # onResultOf от guava для преобразования объекта-оболочки в общий тип и предоставляет сопоставимые для этого типа.Java generics и литье общего типа

У меня есть следующий код:

private static final class Reference<T> { ... } 
    ... 
    public static <T> Function<Reference<T>, T> referenceToData() { 
    return (Function<Reference<T>, T>) ToData.INSTANCE; 
    } 

    private enum ToData implements Function<Reference<Object>, Object> { 
    INSTANCE; 

    @Override 
    public Object apply(final ComparatorMerger.Reference<Object> input) { 
     return input.data; 
    } 
    } 

Когда я компиляции кода я получаю следующее сообщение об ошибке:

[ERROR] ... inconvertible types 
[ERROR] found : Reference.ToData 
[ERROR] required: com.google.common.base.Function<Reference<T>,T> 

Я не уверен, как получить отливку, чтобы работать так, как я хочу это к. Любой совет?

+0

в моих OCPJ6P исследований, единственный пункт, который получил меня путают перемешивает между дженериков и статики, я не понял эту точку но в конце концов я понял, что Generics не может быть смешан со статическими (методы или переменные), поскольку статика присутствует в памяти до времени компиляции, а Generics зависят от времени компиляции, попробуйте этот код в нестационарном коде –

+0

@ EL-conteDe-monteTereBentikh Это не понадобится - см. Мой ответ. –

ответ

3

Вам нужно сделать двойной бросок:

return (Function<Reference<T>, T>)(Function<?, ?>)ToData.INSTANCE; 

Смотрите также мой recent answer используя этот шаблон (из пункта Эффективного Java Джошуа Блоха 27, «благоприятствуют общие методы») в качестве примера действительной бесконтрольной гипсе.

Как я указываю там, вы должны также рассмотреть вопрос о подавлении неконтролируемой предупреждение произнесения:

@SuppressWarnings("unchecked") // this is safe for any T 
final Function<Reference<T>, T> withNarrowedTypes = 
     (Function<Reference<T>, T>)(Function<?, ?>)ToData.INSTANCE; 
return withNarrowedTypes; 
+0

Спасибо! Это сделал трюк! – ekaqu

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