public static void Run(TimerInfo myTimer, TraceWriter log, ICollector<string> outputDocument)
{
log.Info($"C# Timer trigger function executed at: {DateTime.Now}");
JArray auditLogs = GetAuditLogsJArray(TenantId, AuditApiVersion, log);
// outputDocument = null;
// not out-param so it will be passed in.
foreach (dynamic logevent in auditLogs)
{
object document = new
{
id = logevent.id,
activityType = logevent.activityType,
};
string json = JsonConvert.SerializeObject(document);
outputDocument.Add(json);
}
}
声明已从ArrayList
版本修改为另一个版本。修改后的java
声明的优势是什么。
例如:我在这里提到了各种版本的Java支持的三种声明。我在Eclipse中设置Java Compilance leve 1.4
ArrayList
答案 0 :(得分:5)
这只是一个持续改进的过程。
最初,Java没有泛型,所以你必须在你的问题中使用第一个表单。 ArrayList
没有提供关于它包含哪种物体的信息;他们只是Object
。涉及很多铸造,例如:
ArrayList list = new ArrayList();
list.add(new Thing());
// ...
Thing t = (Thing)list.get(0);
// Blech--^^^^^^^
所以Java得到generics,我们可以说ArrayList
包含 1 :
ArrayList<Thing> list = new ArrayList<Thing>();
list.add(new Thing());
// ...
Thing t = list.get(0);
// ^--- No cast! :-)
但请注意冗余,我必须两次写ArrayList<Thing>
。 (嗯,真的,我应该List<Thing> list = new ArrayList<Thing>();
,但这是另一个问题。)
因此,Java能够从变量声明中推断类型参数(<Thing>
),这是<>
来自的地方:
ArrayList<Thing> list = new ArrayList<>();
// No need to repeat ----------------^^
list.add(new Thing());
// ...
Thing t = list.get(0);
// ^--- No cast! :-)
在该示例中,它不会节省大量的输入,但考虑更复杂的情况,比如将字符串映射到Thing
的列表:
Map<String, List<Thing>> map = new HashMap<>();
...比
更短/更少冗余Map<String, List<Thing>> map = new HashMap<String, List<Thing>>();
1 实际列表仍然只是Object
,它只是变量在编译时携带类型参数信息(和一点点)在运行时位)并且编译器为我们插入强制转换; this answer中的更多内容。这是为了在将泛型添加到Java时提供向后兼容性。
答案 1 :(得分:2)
全部用于 L.H.S。引用变量,用于保存对象引用。
只能在编译期间将事物转换为通用或非通用解析。
案例1:
ArrayList val=new ArrayList();//Supported at 1.4
在这种情况下,val
是一个非泛型(非严格类型)引用,它包含ArrayList
的对象引用。
您可以将任何类型的对象添加到此ref变量(val)中。它不仅限于String
。您也可以添加Integer
或Long
。
案例2:
ArrayList<String> val=new ArrayList<String>();//Syntax error,
在Java 1.5中或之后(通用引入),此声明是允许的并且可以使用。此处
val
是一个通用(严格类型)引用,可以保存一个且仅String
类型的对象您了解更多here
案例3:
parameterized types are only available if source level is 1.5 or greater
ArrayList<String> val=new ArrayList< >();//operator is not allowed for source level below 1.7
在Java 1.7中或之后(菱形运算符),允许此声明。它的全部都是左手边参考。所以,val只能添加
String
类型的对象。
有关更多说明See
答案 2 :(得分:0)
随着新版Java的推出,您会看到这些改进。例如,让我们来看看你的情况。
最初Java没有Generics。他们后来从版本5开始支持。这就是第一行
的原因Object
它仅支持类型ArrayList<Integer> val = new ArrayList<Integer>();
ArrayList<String> val = new ArrayList<String>();
ArrayList<UserDefinedObject> val = new ArrayList<UserDefinedObject>();
...
。
由于Generics得到支持,从版本5开始,您现在可以指定要处理的参数类型。因此,这通常用于1.5和1.6版本。
ArrayList<String> val=new ArrayList<>();
从版本1.7开始,Type Inference被引入。
类型推断是Java编译器查看每个方法的能力 调用和相应的声明来确定类型 使调用适用的参数(或参数) ...
...
通用方法向您介绍了类型推断,它使您能够像普通方法一样调用泛型方法
所以你可以写
SelectedItem
在这种情况下,java编译器可以推断泛型方法调用的类型参数,而不必指定它们。
但是,由于Java是向后兼容的,因此您可以在以后的版本中使用以前版本的代码,但反之亦然。