2016-04-23 3 views
0

У меня есть эти классы в библиотеке:Passing `Comparable` Scala массив Java универсального метода

// This is java 
public abstract class Property<T extends Comparable<T>> { 
    public static Property<T> create(String str) { /* Some code */ } 
} 
public class PropertyInt extends Property<Integer> { 
    public static PropertyInt create(String str) { /* Some code */ } 
} 
public class PropertyDouble extends Property<Double> { 
    public static PropertyDouble create(String str) { /* Some code */ } 
} 

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

public void state(Property... properties) { 
    /* some code */ 
} 

Я не могу изменить выше, так как они из библиотеки. В Скале, у меня есть следующий код, который пытается передать массив void state(Property...):

// This is scala 
val propertyInt = PropertyInt.create("index") 
val propertyDouble = PropertyDouble.create("coeff") 
state(Array[Property](proeprtyInt, propertyDouble))) 

Последняя строка кода имеет ошибку: Type mismatch, expected Property[_ <: Comparable[T]], actual Array[Property] Как это исправить?

Примечание: Это упрощенная версия более сложного кода. В реальном коде Property<T extends Comparable<T>> реализует интерфейс IProperty<T extends Comparable<T>> и IProperty принимается за аргументы для state.

Edit: Следующий

val properties = Array(propertyInt.asInstanceOf[IProperty[_ <: Comparable[_]]], 
        propertyDouble.asInstanceOf[IProperty[_ <: Comparable[_]]]) 
state(properties) 

дает ошибку

Error:(54, 33) type mismatch; 
found : Array[Property[_ >: _$3 with _$1 <: Comparable[_]]] where type _$1 <: Comparable[_], type _$3 <: Comparable[_] 
required: Property[?0] forSome { type ?0 <: Comparable[?0] } 
    state(properties) 
     ^

ответ

0

Что вам нужно будет изменить state аргументы порождающим:

public static void state(Property<?> ... properties) { 
    /* some code */ 
} 

Тогда вы можете сделать:

// This is scala 
val propertyInt = PropertyInt.create("index") 
val propertyDouble = PropertyDouble.create("coeff") 

state(propertyInt, propertyDouble) 

state(Array(propertyInt, propertyDouble):_*) 

Upd, если вы не можете изменить подпись state, вы все еще можете назвать это так:

state(Array[Property[_]](propertyInt, propertyDouble):_*) 
+0

Я не могу изменить код для 'state'. Это из библиотеки. –

+0

@HenryW., Можете ли вы создать вспомогательный метод в своем java-коде, который принимает свойство « ...» и возвращает 'Property []'? – Aivean

+0

@HenryW., На самом деле, неважно, см. Обновление. – Aivean

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