3

いくつかの汎用コンテナを含む Java ライブラリがあります。

public interface IColumnTable<T extends IColumn<?, ?>>
{
}
public interface IColumn<D extends IColumnValues<?>, M extends IMetaData> 
{
}
public interface IColumnValues<E> 
{
}
public interface IMetaData 
{
}

それらの具体的なインスタンスを取得するファクトリメソッド

public interface StorageFactory
{
IColumnTable<? extends IColumn<? extends IColumnValues<?>, ? extends IMetaData>> read(String tableName) throws IOException;
}

また、ワイルドカード テーブルを型指定するユーティリティ メソッドもあります (値のキャストと変換によって)

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
    ) 
}

(IColumnValues のパラメーターとして ? の代わりに V を使用することに注意してください)

Java では、次のように呼び出して、Double の値を持つテーブルを取得できます。

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();
        }

ただし、Scala では、同じ呼び出しを機能させることができないようです。

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] 

                ^

Optional.empty() の代わりに null を使用して試してみたところ、次のようになりました。

[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を変更せずにscalaからgetPureTypedTableを呼び出す方法はありますか? (コンバーター関数が null または空のオプションではない場合)

PS: 金曜日の遅い投稿で長々と申し訳ありませんが、私はこれをしばらく見つめていました。

4

1 に答える 1