3

According erasure concept I thought that

List and List<Object> are indentically but I noticed that

List<String> strList = new ArrayList<String>();  
        List<Object> objList = strList; //error
        List objList = strList; //valid construction
        List<?> objList = strList; //valid construction

How to discern between network flows

I want to be able to discern between networks flows. I am defining a flow as a tuple of three values (sourceIP, destIP, protocol). I am storing these in a c++ map for fast access. However, if the destinationIP and the sourceIP are different, but contain the same values, (e.g. )

[packet 1: source = 1.2.3.4, dest = 5.6.7.8] 

[packet 2: source = 5.6.7.8, dest = 1.2.3.4 ]

I would like to create a key that treats these as the same.

I could solve this by creating a secondary key and a primary key, and if the primary key doesn't match I could loop through the elements in my table and see if the secondary key matches, but this seems really inefficient.

I think this might be a perfect opportunity for hashing, but the it seems like string hashes are only available through boost, and we are not allowed to bring in libraries, and I am not sure if I know of a hash function that only computes on elements, not ordering.

How can I easily tell flows apart according to these rules?

4

3 回答 3

4
  • List<?>是一个未知类型的列表。你不能在那里插入,因为你不知道你可以插入什么类型。它有一个通用类型(或没有),但你无法知道它。如果你要插入一些东西(首先对列表进行类型转换),你可能违反了一些东西,所以你不应该这样做。

  • AList<Object>是一个列表,您可以在其中插入任何对象,当您获得一个项目时,您(起初)只知道它是一个对象(并且您已经知道了)。

  • List只允许向后兼容(我认为)。在 Java 5 之前没有泛型。Java 需要允许在两者之间进行类型转换 ListList<Anything>因此遗留代码可以与现代代码一起使用。

于 2014-03-08T19:24:07.583 回答
0

List<?>is generic( wildcard),这意味着它接受从 String 到任何东西,这就是为什么

List<?> objList = strList; //valid construction

whileList<String>不是的子类型List<Object>(但 String[] 实际上是 Object[] 的子类型,这就是泛型和数组不能很好混合的原因之一)。为了Object

List<? extends Object> objList = strList; //valid construction

因为Stringextends Object,这里意味着任何延伸到 Object 的东西都被接受。

于 2014-03-08T19:36:47.570 回答
-1

第一个解释:

如果您定义一个对象列表,则说明该列表可以包含您想要的任何内容。(这是您提供的一些附加信息。)

如果您定义一个字符串列表,那么这不是任何内容的列表。它是一个字符串列表。

字符串列表与对象列表不同。


技术说明:

假设您有这样的课程:

class Machine<T> {
    void process(T input) {
        ...
    }
}

如果您随后创建了一个实例:new Machine<String>(),编译器就会知道,您的新对象将用于处理字符串。如果你想让它处理一个数字、一个数组或其他任何东西,它将失败。

如果您创建了一台更通用的机器,但调用new Machine<Object>()编译器所知道的字符串、数字、数组和任何类型的东西都可以由该机器处理。

编译器不允许您将特定的 String-Machine ( new Machine<String>()) 转换为通用的 Object-Machine ( Machine<Object>),因为这将允许您让它处理数字、数组等,而不是处理它不适合的用途。

于 2014-03-08T19:14:16.747 回答