Java-返回泛型类型的方法需要@SuppressWarnings(";unchecked";)和(T)new Result()
我用这个方法得到碎片Java-返回泛型类型的方法需要@SuppressWarnings(";unchecked";)和(T)new Result(),java,android,generics,Java,Android,Generics,我用这个方法得到碎片 abstract <T extends Fragment & IMyItem> T createFragment(); public <T extends Fragment & IMyItem> T getFragment() { return createFragment(); } 我想任何一节课 extends Fragment implements IMyItem 你一定可以 <T extends Fragm
abstract <T extends Fragment & IMyItem> T createFragment();
public <T extends Fragment & IMyItem> T getFragment() {
return createFragment();
}
我想任何一节课
extends Fragment implements IMyItem
你一定可以
<T extends Fragment & IMyItem>
有什么问题吗
我认为任何“扩展片段实现IMyItem”的类都是可以的
任何此类类都是类型参数T
的有效替代品,这就是问题所在。现在假设您有另一个类:
class AnotherFragment extends Fragment implements IMyItem { }
然后调用该方法,如:
AnotherFragment anotherFragment = createFragment();
此调用将在编译时传递。但假设它允许您返回newmypagefragmentimpl()
根据您的方法,由于MyPageFragmentImpl
不是另一个片段,分配将在运行时失败,出现ClassCastException
您必须从该方法返回类型为T
的结果,类型参数T
将从您分配结果的引用类型推断出来。所以,问题是,您将如何创建T
的实例?你不能直接这么做。一种可能性是将类
实例传递给该方法,并将签名更改为:
@Override
<T extends Fragment & IMyItem> T createFragment(Class<T> clazz) {
return clazz.newInstance();
}
在这种情况下,类型参数T
将被推断为MyPageFragmentImpl
,这样的赋值现在就安全了
如果您的类没有0-arg构造函数,则此操作可能会失败。为此,可以使用方法为类获取适当的构造函数,然后使用方法返回实例
我认为任何“扩展片段实现IMyItem”的类都是可以的
任何此类类都是类型参数T
的有效替代品,这就是问题所在。现在假设您有另一个类:
class AnotherFragment extends Fragment implements IMyItem { }
然后调用该方法,如:
AnotherFragment anotherFragment = createFragment();
此调用将在编译时传递。但假设它允许您返回newmypagefragmentimpl()
根据您的方法,由于MyPageFragmentImpl
不是另一个片段,分配将在运行时失败,出现ClassCastException
您必须从该方法返回类型为T
的结果,类型参数T
将从您分配结果的引用类型推断出来。所以,问题是,您将如何创建T
的实例?你不能直接这么做。一种可能性是将类
实例传递给该方法,并将签名更改为:
@Override
<T extends Fragment & IMyItem> T createFragment(Class<T> clazz) {
return clazz.newInstance();
}
在这种情况下,类型参数T
将被推断为MyPageFragmentImpl
,这样的赋值现在就安全了
如果您的类没有0-arg构造函数,则此操作可能会失败。为此,您可以使用方法为类获取适当的构造函数,然后使用方法返回实例。但由于这是在enum中,所以我无法在每次单击时放置类。我想我需要创建一个新的MyItemFragment,但因为它在enum中,所以我不能在每一次单击中放置一个类。我想我需要创建一个新的MyItemFragment。