我有一个简单的通用接口
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
类型?
答案 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));
}
}