3

에서 와일드 카드 자바 함수를 호출합니다 값의 변환 및 변환을 통해 내 와일드 카드 테이블을 입력하는 유틸리티 메서드입니다.어떻게 몇 가지 일반적인 컨테이너 자바 라이브러리가 스칼라

public class TableConverterUtil 
{ 
public static <T, V> IColumnTable<IColumn<IColumnValues<T>, IMetaData>> getPureTypedTable(
     IColumnTable<? extends IColumn<? extends IColumnValues<V>, ? extends IMetaData>> tableRaw, 
     Class<T> type, 
     Optional<Function<V, Optional<T>>> converter 
    ) 
} 

(V 대신에 V를 사용합니다.

try { 
      IColumnTable<IColumn<IColumnValuesExact<Double>, IMetaData>> myDoubleTable = TableConverterUtil.getPureTypedTable(
       StorageManagerUtil.getDefault().get("default").read("myTableName"), 
       Double.class, 
       Optional.empty() 
      ); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (StorageManagerInstantiationException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

그러나 스칼라 I가 같은 전화를받을 수하지 않는 것 : 내가 호출 할 수 있습니다 자바에서

IColumnValues에 대한 매개 변수)로 Double의 값으로 표를 얻기 위해 다음과 같은 일 :에

TableConverterUtil.getPureTypedTable(
    StorageManagerUtil.getDefault.get("default").read("myTableName"), 
    classOf[Double], 
    Optional.empty() 
) 

결과 :

[file and line number]: no type parameters for method emp 
ty:()java.util.Optional[T] exist so that it can be applied to arguments() 
[error] --- because --- 
[error] undetermined type 
[error]  Optional.empty() 
[error]    ^
[error] [file and line number]: type mismatch; 
[error] found : java.util.Optional[T] 
[error] required: java.util.Optional[java.util.function.Function[?,java.util.Op 
tional[?]]] 
[error]  Optional.empty() 
[error] 

       ^

은 또한 영업 이익 NULL 대신에 그것을 시도 결과 tional.empty().

[error] [file & line no]: no type parameters for method get 
PureTypedTable: (x$1: com.wwa.data.interfaces.IColumnTable[_ <: com.wwa.data.int 
erfaces.IColumn[_ <: com.wwa.data.interfaces.IColumnValues[V], _ <: com.wwa.data 
.interfaces.IMetaData]], x$2: Class[T], x$3: java.util.Optional[java.util.functi 
on.Function[V,java.util.Optional[T]]])com.wwa.data.interfaces.IColumnTable[com.w 
wa.data.interfaces.IColumn[com.wwa.data.interfaces.IColumnValuesExact[T],com.wwa 
.data.interfaces.IMetaData]] exist so that it can be applied to arguments (com.w 
wa.data.interfaces.IColumnTable[?0], Class[Double], Null) 
[error] --- because --- 
[error] argument expression's type is not compatible with formal parameter type; 

[error] found : com.wwa.data.interfaces.IColumnTable[?0(in method doWork)] wh 
ere type ?0(in method doWork) <: com.wwa.data.interfaces.IColumn[_ <: com.wwa.da 
ta.interfaces.IColumnValues[_], _ <: com.wwa.data.interfaces.IMetaData] 
[error] required: com.wwa.data.interfaces.IColumnTable[_ <: com.wwa.data.interf 
aces.IColumn[_ <: com.wwa.data.interfaces.IColumnValues[?V], _ <: com.wwa.data.i 
nterfaces.IMetaData]] 
[error]  TableConverterUtil.getPureTypedTable(
[error]      ^
[error] [file & line No.]: type mismatch; 
[error] found : com.wwa.data.interfaces.IColumnTable[?0(in method doWork)] wh 
ere type ?0(in method doWork) <: com.wwa.data.interfaces.IColumn[_ <: com.wwa.da 
ta.interfaces.IColumnValues[_], _ <: com.wwa.data.interfaces.IMetaData] 
[error] required: com.wwa.data.interfaces.IColumnTable[_ <: com.wwa.data.interf 
aces.IColumn[_ <: com.wwa.data.interfaces.IColumnValues[V], _ <: com.wwa.data.in 
terfaces.IMetaData]] 
[error]  StorageManagerUtil.getDefault.get("default").read("myTableName"), 
[error]  

               ^

는 또한 실제로에서 함수를 통과 할 수 있도록 IColumnValues에게 주어진 와일드 카드 그러나 운은, 내가 시도 할 때마다 것으로 보인다 함정에 보조 방법을 시도했다 내부 _ 중 하나를 컴파일러가 적합을 던지는 명명 된 유형 매개 변수에 바인드합니다.

Java 라이브러리를 스트레치 방식으로 변경할 수 있지만 Scala와 Java가 완전히 상호 운용 될 수 있어야한다고 생각합니다.

java를 변경하지 않고 getPureTypedTable을 scala에서 호출 할 수 있습니까?

PS (컨버터 기능 널 (null) 또는 옵션 비어 있지과) : 지금

+3

선택적 - e 유형에 대해 명시 적으로 설명하는 경우 컴파일됩니까? 지. 'Optional.empty [java.util.function.Function [_, _]]()'? –

+0

스칼라 타입 추론은 때때로 혼란 스러울 수 있습니다. 이 경우에는 호출의 어디에서나 실제로 사용되지 않으므로 유형 매개 변수 'V'로 의심됩니다. 첫 번째 단계는 명시 적 형식 매개 변수를 전달하는 것입니다. 'getPureTypedTable [Double, Double] (...)'. – lmm

+0

아니요. 와일드 카드로 컴파일되지 않습니다. –

답변

0

나는이에 대한 답을 찾을 생각 긴 장황한 죄송합니다 금요일에 미치는 늦게 게시와 나는 잠시 동안 쳐다 봤는데 스칼라 그룹 스레드 https://groups.google.com/forum/#!topic/scala-user/JlCsy48poIU

그것은 유형의 이름을 일치 패턴을 포함하지만 또한 내가 무시하는 것이 안전하다고 생각되지 않은 유형에 대해 경고 컴파일러를 제공합니다 ... 사람이 더 좋은 방법이 있다면

def callWildcardTableFunction(table: IColumnTable[_ <: IColumn[_ <: IColumnValues[_], _ <: IMetaData]]) 
    : IColumnTable[IColumn[IColumnValues[Double], IMetaData]] = table match 
    { 
    case boundTable: IColumnTable[IColumn[IColumnValues[valueType], m]] @unchecked => 
     TableConverterUtil.getPureTypedTable[Double, valueType](boundTable, classOf[Double], null) 
    } 

/이건 실제로 안전하지 않아요!