- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我用这个方法来获取 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/
我是一名优秀的程序员,十分优秀!