Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java-返回泛型类型的方法需要@SuppressWarnings(";unchecked";)和(T)new Result()_Java_Android_Generics - Fatal编程技术网

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。