Tag: 通配符

在eclipse中运行Java app时如何避免glob扩展

我遇到了Eclipse运行配置的特殊行为,它似乎只是一个Windows问题。 假设我有一个打印出命令行参数的Java应用程序,如下所示: public class WildCard { public static void main(String[] args) { for (String arg: args) { System.out.println(arg); } } } 如果我使用可以由shell扩展的外卡提供参数,shell将展开它并将其提供给Java程序。 这并不奇怪。 所以,如果我在命令提示符下做 java WildCard test/* 该程序将打印 test/foo.txt test/bar.txt 其中foo.txt和bar.txt是目录“test”中的文件。 如果我用引号括起通配符参数,可以防止Shell扩展; * nix上的单引号,以及Windows上的双引号。 因此对于Windows,如果我在命令提示符下执行以下操作: java WildCard “test/*” 该程序现在将打印 test/* (没有扩张)。 但是,我发现Eclipse运行启动程序中的引用似乎没有效果,并且参数仍在扩展。 如果我放 “test/*” 在Eclipse运行启动程序的程序参数部分,并运行上面的类,我仍然得到 test/foo.txt test/bar.txt 换句话说,当程序实际运行时,双引号似乎丢失了。 这似乎只发生在Windows上。 有没有办法在Windows上使用Eclipse运行启动程序阻止glob扩展?

具有下限的嵌套通配符

所以我阅读了主要的Java通用常见问题解答,让我掌握的一件事就是具有下限的嵌套通配符。 我想举例说明我所理解的内容,具体哪些有效,以及我如何看待它。 也许你可以告诉我我正在考虑的方式这是错误的,即使编译器没有抱怨“好”的情况。 示例1(有意义): static void WildcardsMethod(List<? extends Pair> list) { System.out.println(“It worked”); } static void TestWildcardsMethod() { List<Pair> list = null; WildcardsMethod(list); } 我首先看看最深的通配符并绑定WildcardMethod的签名。 它正在寻找Pair Pair 。 因此,我可以使用Pair , Pair等。 如果我决定用Pair代替Pair我现在有一些看起来像下面代码的东西Pair Pair : List<? extends Pair> 现在,通配符表示参数化类型Pair的类型/子类型。 因此,我可以将Pair或SubPair传递给WildcardsMethod。 例2(有意义): static void WildcardsMethod(List<? extends Pair> list) { System.out.println(“It worked”); } static void TestWildcardsMethod() { List<Pair> […]

使用上边界通配符时不兼容的类型

我真的很困惑上界类型在Javagenerics中是如何工作的。 比方说我有 interface IModel interface I class A implements I class B implements I class C implements I 那么我有一个带参数的方法如下 foo(IModel<Map<? extends I, Map<? extends I, List>>> dataModel) 调用那个方法就像 IModel<Map<A, Map<B, List>>> model = … foo(model) 以编译错误结束 Error:(112, 49) java: incompatible types: IModel<java.util.Map<A,java.util.Map<B,java.util.List>>> cannot be converted to IModel<java.util.Map<? extends I,java.util.Map<? extends I,java.util.List>>> 我已经从Oracle网络上阅读了关于Javagenerics的文档,试图谷歌它,但必须有一些我完全被误解的东西。

传递给方法的无界通配符

public class ColTest { static T wildSub(ArrayList holder, T arg){ T t=holder.get(0); return t; } public static void main(String[] args) { ArrayList list=new ArrayList(Arrays.asList(2L,3L,7L)); Long lng=1L; ColTest.wildSub(list, lng); } } 真的很感兴趣为什么这个片段是合法的,因为wildSub的签名只接受T ArrayList或从T派生,以及类型为T arg。 但表示 – 某些特定类型,未知,以及它如何满足编译器? 毕竟类型并不意味着 …

使用Java通配符

我想在Java中实现某种组件系统。 有一个名为Form的界面 interface Form { T getObject(); // … } 我想提供一些名为CompoundForm的抽象类来帮助从简单forms构建复杂的表单。 CompoundForm的用户需要使用Component接口提供每个组件的一些描述 interface Component { /** Factory method to build new form for given component */ Form createForm(U u, String prefix); /** Extract component of type U from the compound t */ U get(T t); /** Mutate t or build new compound of type T […]

带有ArrayList通配符的Java HashMap

我有一个HashMap,其值是ArrayLists,我正在尝试编写一个函数来接受这些HashMaps的generics实例 HashMap<String, ArrayList> myMap = new HashMap<String, ArrayList>(); public static void foo(HashMap<?, ArrayList> a) {} public static void bar(HashMap<?, ? extends ArrayList> a) {} // Compilation Failure! foo(myMap); // This works, but why do I need ? extends ArrayList bar(myMap) 错误消息是 类型为Example的方法foo(HashMap<?,ArrayList>)不适用于参数( HashMap<String,ArrayList> )。 为什么我需要为extends ArrayList使用通配符? 我认为通过使用ArrayList (没有? extends ),我可以将函数限制为仅具有ArrayList值的HashMaps。 我也知道以下通用方法有效: public static void printer(HashMap<K, […]

回归collections vs Collection

这两种方法有什么区别? Collection getTypes(); VS Collection getTypes(); 如果Type是类或接口,这是否重要? 特别是,在设计API时,首选哪个版本以及为什么?

Java通配符和generics? 超级T和? 延伸T.

当处理通配符,如设置/添加通用项目到某个容器时,是否建议使用这样的东西? void add(List someList,someitem){ someList.add(someItem); } 当检索项目时,建议使用这样的东西 void f1(List obj, T item) { obj.add(item); } 这背后的原理是什么? 我什么时候才能知道我是否应该使用它?

从通配符到正则表达式

我想允许两个主要的通配符? 和*来过滤我的数据。 以下是我现在正在做的事情(正如我在许多网站上看到的): public boolean contains(String data, String filter) { if(data == null || data.isEmpty()) { return false; } String regex = filter.replace(“.”, “[.]”) .replace(“?”, “.”) .replace(“*”, “.*”); return Pattern.matches(regex, data); } 但是我们不应该逃避所有其他的正则表达式特殊字符,比如| 或(等等?还有,也许我们可以保留?和*如果它们前面有一个\ ?例如,类似于: filter.replaceAll(“([$|\\[\\]{}(),.+^-])”, “\\\\$1”) // 1. escape regex special chars, but ?, * and \ .replaceAll(“([^\\\\]|^)\\?”, “$1.”) // 2. replace any ? […]

用于上限和下限通配符的Javagenerics

我正在阅读javagenerics,我遇到了一个有趣的查询。 我的问题如下。 对于上限有界的通配符 public static void printList(List list) { for (int i = 0; i < 10; i++) { list.add(i);// gives compilation error } } 对于较低的有界通配符 public static void printList(List list) { for (int i = 0; i < 10; i++) { list.add(i);// successfully compiles } } 我对此感到困惑,因为查看Sun Oracle文档,我理解代码也应该为第1点编译 上限通配符 下界通配符 有人可以帮我理解这个吗?