- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我一直在尝试正确地理解Java泛型。因此,在这一探索中,我遇到了一个原则“广告中的真理原则”,我想用简单的语言来理解它。
广告中的真理原则:数组的修饰类型必须是子类型
删除其静态类型。
我已经编写了示例代码.java和.class文件,如下所示。请仔细阅读代码,并解释一下代码中的哪一部分指定/指示了以上声明的哪一部分。
我给我写了评论,我不应该在这里写代码说明。
public class ClassA {
//when used this method throws exception
//java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.String;
public static <T> T[] toArray(Collection<T> collection) {
//Array created here is of Object type
T[] array = (T[]) new Object[collection.size()];
int i = 0;
for (T item : collection) {
array[i++] = item;
}
return array;
}
//Working fine , no exception
public static <T> T[] toArray(Collection<T> collection, T[] array) {
if (array.length < collection.size()) {
//Array created here is of correct intended type and not actually Object type
//So I think , it inidicates "the reified type of an array" as type here lets say String[]
// is subtype of Object[](the erasure ), so actually no problem
array = (T[]) Array.newInstance(array.getClass().getComponentType(), collection.size());
}
int i = 0;
for (T item : collection) {
array[i++] = item;
}
return array;
}
public static void main(String[] args) {
List<String> list = Arrays.asList("A", "B");
String[] strings = toArray(list);
// String[] strings = toArray(list,new String[]{});
System.out.println(strings);
}
}
最佳答案
我将Java泛型和集合称为“本书”,将本书的作者称为“作者”。
由于本书在解释IMO原理方面做得很差,因此我会不止一次地对这个问题表示支持。
陈述
广告中的真理原则:
数组的修饰类型必须是擦除其静态类型的子类型。
进一步称为原理。
该原理有何帮助?
A
和
B
是类型
A ref = new B();
A
是
ref
的静态类型(
B
是
ref
的动态类型)。学术界术语。
arr2 = new Number[30]
中,
arr2
的
化类型是
Number[]
,其数组类型为组件类型
Number
。
T
是类型参数,以下代码的运行时 View
<T extends Comparable<T>> void stupidMethod(T[] elems) {
T first = elems[0];
}
将会
void stupidMethod(Comparable[] elems) {
Comparable first = elems[0];
}
这使得
Comparable
成为
T
的运行时类型。为什么是
Comparable
?因为那是
T
的最左边界。
T
是类型参数
T[] a = (T[])new Object[0]; // type parameter T involved in lvalue
或者
String[] a = toArray(s); // type parameter involved in rvalue
// where the signature of toArray is
<T> T[] toArray(Collection<T> c);
在左值或右值中不涉及任何类型参数的情况下,该原理无关紧要。
<T extends Number> void stupidMethod(List<T>elems) {
T[] ts = (T[]) new Number[0];
}
Q1 :
ts
所引用的数组的简化类型是什么?
Number
创建组件类型为
new
的数组。
Number[]
。
ts
的静态类型是什么?
T[]
Q3 :静态
ts
类型的擦除是什么?
T
。鉴于
T extends Number
是有界的,所以
T
的擦除类型是其最左边的边界-
Number
。现在我们知道了
T
的擦除类型,对于
ts
的擦除类型是
Number[]
Number[]
是
Number[]
的子类型吗?是=>这意味着遵循原则
。<T extends Number> void stupidMethod(List<T>elems) {
T[] ts = (T[]) new Object[0];
}
Q1 :ts
所引用的数组的简化类型是什么?new
创建数组,组件类型为Object
,因此为 Object[]
。ts
的静态类型是什么?T[]
Q3 :静态ts
类型的擦除是什么?T
。鉴于T extends Number
是有界的,所以T
的擦除类型是其最左边的边界-Number
。现在我们知道了T
的擦除类型,对于ts
的擦除类型是 Number[]
Object[]
是Number[]
的子类型吗?否=>,这意味着未遵循原则。
<T> T[] toArray(Collection<T> c){
return (T[]) new Object[0];
}
客户代码
List<String> s = ...;
String[] arr = toArray(s);
Q1 :provider方法返回的数组的简化类型是什么?
new Object[...]
。这意味着该方法返回的数组的修饰类型为
Object[]
。
arr
的静态类型是什么?
String[]
Q3 :静态
ts
类型的擦除是什么?
String[]
相同。
Object[]
是
String[]
的子类型吗?否=>,这意味着未遵循原则。
<T> T[] toArray(Collection<T> initialContent, Class<T> clazz){
T[] result = (T[]) Array.newInstance(clazz, initialContent);
// Copy contents to array. (Don't use this method in production, use Collection.toArray() instead)
return result;
}
客户代码
List<Number> s = ...;
Number[] arr = toArray(s, Number.class);
Q1 :provider方法返回的数组的简化类型是什么?
Number[]
。
arr
的静态类型是什么?
Number[]
Q3 :静态
ts
类型的擦除是什么?
Number[]
相同。
Number[]
是
Number[]
的子类型吗?是=>这意味着遵循原则
。lvalue = rvalue
我们将rvalue
作为提供者,并将lvalue
作为接收者。<T> T[] toArray(Collection<T> c){
return (T[]) new Object[0];
}
方法签名<T> T[] toArray(Collection<T> c);
可以看成是广告:给我一个Long
的列表,我会给你一个Long
的数组。Object
的数组。toArray
方法在于其营销 Activity 。关于java - 理解广告Java泛型中的真理原理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36589210/
我有以下两个问题,我尝试用谷歌搜索这些问题,但没有找到任何运气。请帮助我。 我已将 AdMob 广告集成到我的 iPhone 应用程序中。当点击admob View 时,safari会被打开,如果加载
我用简单的代码在我的网站上使用了自动点击代码并且它起作用了。下面是我之前使用的代码。 $(document).ready(function(){ var list = document.getEle
我需要将自定义 BLE 广告数据从 ios/android 设备广播到许多自定义 BLE 设备。我的目标是设置 ble adv 包的字节以将其广播到附近的 ble 设备。 据我所知,我需要设置我的 i
我想从动态内容的广告意义上展示广告,即调用 API 并发送一些关键字来获取广告,这可能吗? 例如: Adsense.GetAdsForKeywords("car, subaru, auckland")
一位客户要求我使用他的 Google 发布商 ID 和广告 ID 创建他的广告。 他告诉我在博客上创建这个。 我现在的问题是我不知道他到底是什么意思,因为我习惯的是复制代码并粘贴它。 那么,有人可以向
经过大量搜索,我找不到任何支持以非常小的尺寸(40*40 平方或更少像素)展示广告的广告网络。 我看到应用程序可以这样做(就像左上角的高清摄像头 [附图片])。点击此广告后,它会直接进入 google
我有一个博客,上面有一些赞助帖子。 如果用户访问链接到赞助商的帖子,我希望在其他网站(使用 AdSense)上为最近访问过我网站的访问者显示与该赞助商相关的 AdSense 广告。 这是否可以使用动态
我正在开发一个网站,我想在其中展示 Google 广告。如何在我的网站上测试广告?此外: Google 允许我测试广告吗? 它是否认为我的测试是假印象? 我会被 Adsense 屏蔽吗? 这是网站链接
我在尝试显示来自 Admob 的实时广告时遇到问题。测试广告工作正常,但当我切换到实时广告时,我不断收到此错误 Unable to get provider com.google.android.g
我已经集成了 https://pub.dev/packages/firebase_admob进入我的应用程序并实现 rewarded ads .我现在的问题是我想通过这个插件使用中介。唯一的事情是我知
有关背景信息,请参阅:this question 因此,授权流程的第一步是使用 Web 浏览器中的 URL 获取授权 token ,如下所示。对于桌面应用程序,它需要具有以下签名(我对其进行了未编码以
大约一周前(9 月 13 日)Facebook 推出了新的后置链接格式(看起来更像照片后置 - 大图等)。但是,当我通过 API 上传帖子时(效果很好),尽管 Facebook 界面(直接 Faceb
我有来自 webhook 调用的以下 JSOn 响应 { "responseId": "d5c70d8b-e8ad-41df-bb3b-26b0e51d60ca-a14fa99c", "que
我想在内容前面放置一个 Logo /广告,有很多方法可以做到,但问题是它们使用 JS 显示/隐藏方法。发生的情况是,当用户观看 Logo /广告时,内容不会加载,这会导致用户首先等待 Logo /广告
我一直在按照本教程 ( http://www.kilobolt.com/day-7-creating-an-android-game-from-start-to-finish.html ) 创建 An
我有一个包含 dfp 广告的单页网络应用程序。我有两个我正在触发的 dfp adunits,它们位于内容之间,内容是特定类别的文章列表。 当我点击另一个类别时,它只会加载不同类别的文章(不会更改地址栏
我通过 Facebook 的 Power Editor 上传了 212 封电子邮件的 csv,几秒钟后我可以看到观众中有 200 位用户。 我通过 Facebook 的 Power Editor 将相
我的移动应用程序中有一个 AdMob banndr 广告。大多数时候它不会出现。这是它的工作方式,还是我在设置时做错了什么?泰德 最佳答案 如果没有要显示的广告,则不会返回广告。如果您在 admob
我最近让 admob 广告正常工作,我通过以下方式对其进行了测试: AdRequest adRequest = new AdRequest.Builder()
我正在尝试将 Admob 横幅对齐到设备屏幕的右侧。但是它对我不起作用。我正在创建这样的横幅 RelativeLayout layout = new RelativeLayout(activity
我是一名优秀的程序员,十分优秀!