gpt4 book ai didi

返回泛型类型的 Java 方法需要 @SuppressWarnings ("unchecked") 和 (T) new Result()

转载 作者:行者123 更新时间:2023-11-29 07:50:13 24 4
gpt4 key购买 nike

我用这个方法来获取 fragment ,

abstract <T extends Fragment & IMyItem> T createFragment();

public <T extends Fragment & IMyItem> T getFragment() {
return createFragment();
}

@Override
<T extends Fragment & IMyItem> T createFragment() {
return new MyPageFragmentImpl();
}

在 eclispe 上,这个方法说

类型不匹配:无法从 MyPageFragmentImpl 转换为 T

但是MyPageFragmentImpl的定义是

public final class MyPageFramgmentImpl extends Fragment implements IMyItem

我认为任何类

extends Fragment implements IMyItem

必须没问题

<T extends Fragment & IMyItem> 

有什么问题?

最佳答案

I think any class which "extends Fragment implements IMyItem" MUST be ok

任何此类类都是类型参数 T 的有效替代,这就是问题所在。现在假设你有另一个类:

class AnotherFragment extends Fragment implements IMyItem { }

然后你像这样调用这个方法:

AnotherFragment anotherFragment = createFragment();

此调用将在编译时通过。但是假设它的编译器允许你从你的方法返回 new MyPageFragmentImpl();,赋值将在运行时失败并出现 ClassCastException,作为 MyPageFragmentImpl 不是 AnotherFragment

您必须从该方法返回类型为 T 的结果,类型参数 T 将从您将结果分配给的引用类型中推断出来。所以,重点是,您将如何创建 T 的实例?你不能直接这样做。一种可能性是将 Class 实例传递给该方法,并将签名更改为:

@Override
<T extends Fragment & IMyItem> T createFragment(Class<T> clazz) {
return clazz.newInstance();
}

现在,无论您希望该方法返回什么实例,只需将该类的 Class 实例传递给此方法,如下所示:

MyPageFragmentImpl pageFragment = createFragment(MyPageFragmentImpl.class);

在这种情况下,类型参数 T 将被推断为 MyPageFragmentImpl,并且像上面这样的赋值现在是安全的。

如果您的类没有 0-arg 构造函数,这可能会失败。为此,您可以使用 Class#getConstructor() 为该类获取适当的构造函数。方法,然后使用 Constructor#newInstance() 返回实例方法。

关于返回泛型类型的 Java 方法需要 @SuppressWarnings ("unchecked") 和 (T) new Result(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21781748/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com