Java版本中的ArrayList修改为什么?

时间:2017-03-28 05:37:30

标签: java arraylist

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

3 个答案:

答案 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。您也可以添加IntegerLong

案例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的推出,您会看到这些改进。例如,让我们来看看你的情况。

  1. 最初Java没有Generics。他们后来从版本5开始支持。这就是第一行

    的原因
    Object

    它仅支持类型ArrayList<Integer> val = new ArrayList<Integer>(); ArrayList<String> val = new ArrayList<String>(); ArrayList<UserDefinedObject> val = new ArrayList<UserDefinedObject>(); ...

  2. 由于Generics得到支持,从版本5开始,您现在可以指定要处理的参数类型。因此,这通常用于1.5和1.6版本。

    ArrayList<String> val=new ArrayList<>();
    
  3. 从版本1.7开始,Type Inference被引入。

      

    类型推断是Java编译器查看每个方法的能力   调用和相应的声明来确定类型   使调用适用的参数(或参数)   ...
      ...
      通用方法向您介绍了类型推断,它使您能够像普通方法一样调用泛型方法

    所以你可以写

    SelectedItem

    在这种情况下,java编译器可以推断泛型方法调用的类型参数,而不必指定它们。

  4. 但是,由于Java是向后兼容的,因此您可以在以后的版本中使用以前版本的代码,但反之亦然。