通用接口的行为不符合预期

时间:2017-10-23 17:33:35

标签: java generics

我有一个简单的通用接口

public interface Person<T> {
    T foo(T other);
}

和一个班级

    public class Data<T extends Person> {

      public void doSomething(List<T> data){
         data.stream().reduce((a, b) -> (T)a.foo(b));
      }
  }

当我使用函数foo使用reduce时,假设返回泛型类型T,编译器说它无法返回,因为它是一个错误的返回类型。

但正如您可以看到方法foo获取并返回T

当我使用我的工作区myObj.foo(obj)进行自动填充时 我看到返回类型和参数类型是一个对象类型。 任何人都可以向我解释为什么会发生这种情况,为什么它不是来自T类型?

3 个答案:

答案 0 :(得分:1)

您必须指定private void MainPivot_Loaded(object sender, Windows.UI.Xaml.RoutedEventArgs e) { if (Windows.Foundation.Metadata.ApiInformation.IsTypePresent("Windows.UI.Xaml.Media.AcrylicBrush")) { MainPivot.Background = Application.Current.Resources["SystemControlAltHighAcrylicWindowBrush"] as AcrylicBrush; } } 的通用参数:

Person

或者稍微移动你的泛型,我还没有看到泛型参数有什么意义。

答案 1 :(得分:1)

您的问题是,您使用字母T代表两个完全不同的类型参数 - Person泛型类中的type参数和Data中的type参数泛类。

这些参数不是同一个 - 你已经设法通过对两者使用相同的字母来迷惑自己。但是,编译器不会混淆;并且它非常正确地告诉你,你不能用一个T代替另一个。

特别是,您尝试将T返回的foo类型的表达式转换为其他类型的T

答案 2 :(得分:1)

这里有2个参数令人困惑。

中的T
public interface Person<T> {
    T foo(T other);
}

在接口Person上定义了一个参数。

public class Data<T extends Person> {
    public void doSomething(List<T> data) {
        data.stream().reduce((a, b) -> (T)a.foo(b));
    }
}

定义类型为Data的类Person的参数,该参数隐式等于Person<Object>

因此List<T>是扩展Person的对象列表,方法foo()的返回类型为Person第一个参数Object,而reduce期望返回类型为输入Person

此代码与您的代码没有什么不同:

public class Data<E extends Person> {
    public void doSomething(List<E> data) {
        data.stream().reduce((a, b) -> (E)a.foo(b));
    }
}