2

Java 7 ビルド 21 に切り替えたところ、奇妙なコンパイル エラーが発生し始めました。たとえば、以下のコード スニペットはコンパイルされません (ただし、IntelliJ はエラーを表示しません)。

    1 Iterable<?> parts = ImmutableList.<String>of("one", "two");
    2 Function<?, String> function = new Function<Object, String>() {
    3    @Override
    4    public String apply(final Object input) {
    5        return input.toString();
    6    }
    7 };
    8 Iterable<String> result = Iterables.transform(parts, function);
    9 System.out.println(result);

?しかし、 2行目を次のように置き換えるとObject

    2 Function<Object, String> function = new Function<Object, String>() {

その後、コンパイルは成功します。

私が得ているエラーはやや不可解です:

error: method transform in class Iterables cannot be applied to given types;
required: Iterable<F>,Function<? super F,? extends T> 
found: Iterable<CAP#1>,Function<CAP#2,String> 
reason: no instance(s) of type variable(s) F,T exist so that argument type Function<CAP#2,String>
conforms to formal parameter type Function<? super F,? extends T> 
where F,T are type-variables:
F extends Object declared in method <F,T>transform(Iterable<F>,Function<? super F,? extends T>) 
T extends Object declared in method <F,T>transform(Iterable<F>,Function<? super F,? extends T>) 
where CAP#1,CAP#2 are fresh type-variables: 
CAP#1 extends Object from capture of ?
CAP#2 extends Object from capture of ? extends Object

行 2 を次のように変更する

    2 Function<? extends Object, String> function = new Function<Object, String>() {

効果はありません。

JDK 1.7.0_11-b21 を使用しています。これは、ビルド 4 で正常にコンパイルされていました。

これはjavacバグですか、それとも私のものですか?

4

3 に答える 3

6

メソッドのシグネチャは次のとおりです。

<F,T> Iterable<T> transform(Iterable<F> fromIterable, Function<? super F,? extends T> function) 

型パラメーター F の意味は次のとおりです。

Iterable<F> :
    F can be any type here, but will influence the type parameter to Function
Function<? super F, ? extends T> :
    the first type parameter (? super F) MUST be a supertype of F

次のように入力します。

Iterable<?>
Function<?, String>

あなたは何でもIterableと言っているので、例えばIterable<Integer>. あなたはまた、関数から文字列までと言っているので、例えばFunction<String, String>. String は Integer のスーパークラスではないため、(? super F)条件を満たしていません。

于 2013-01-21T15:31:28.303 に答える
2

これは、 、、Function<?,String>のいずれかである可能性があるためです。したがって、実際には Foo が必要になる可能性があるため、関数にオブジェクトを入力できないのは正しいことです。Function<Object,String>Function<String,String>Function<Foo,String>

もちろん、Iterable<?>,Iterable がオブジェクトを吐き出すことしかわかっていないので、a を使用しFunction<Object,WhatEver>て変換することしかできません。

于 2013-01-21T15:15:50.000 に答える
1

私は実際に変更することでこれを解決することができました

2 Function<?, String> function = new Function<Object, String>() {

2 Function<? super Object, String> function = new Function<Object, String>() {

あなたがそれについて考えるとき、それは理にかなっています-関数はここでの消費者です(悪名高いPECSイディオムから)。

于 2013-01-21T15:39:53.940 に答える