Tag: 通配符

Collections.min / max方法的签名

在Java中,Collections类包含以下方法: public static <T extends Object & Comparable> T min(Collection c) 它的签名因其对generics的高级使用而闻名,因此在Java的Nutshell书籍和官方的Sun Generics Tutorial中都提到了它。 但是,我找不到令人信服的答案: 为什么Collection的forms参数Collection Collection ,而不是Collection ? 有什么额外的好处?

带有无界通配符的Javagenerics?

我有一个将对象转换为字符串的接口: public interface Converter { String asString(T object); } 以及存储所有可用转换器的地图: Map<Class, Converter> converterMap; 现在我有一个要转换的异构数据列表,如下所示: List data = fetchData(); List stringData = new ArrayList(data.size()); for (Object datum : data) { stringData.add(convertrMap.get(datum.getClass()).asString(datum)); } 但是这段代码没有编译: error: method asString in interface Converter cannot be applied to given types; stringData.add(converterMap.get(datum.getClass()).asString(datum)); required: CAP#1 found: Object reason: actual argument Object cannot be […]

Hadoop的FileSystem列出API调用中的通配符

tl;dr:为了能够在列出的路径中使用通配符(globs),只需使用globStatus(…)而不是listStatus(…) 。 上下文 我的HDFS集群上的文件按分区进行组织,日期为“根”分区。 文件结构的简化示例如下所示: /schemas_folder ├── date=20140101 │ ├── A-schema.avsc │ ├── B-schema.avsc ├── date=20140102 │ ├── A-schema.avsc │ ├── B-schema.avsc │ ├── C-schema.avsc └── date=20140103 ├── B-schema.avsc └── C-schema.avsc 就我而言,该目录在不同日期存储不同类型数据(本例中为A,B和C)的 Avro模式。 随着时间的推移,模​​式可能会开始存在,发展并停止存在。 目标 我需要能够尽快获得给定类型的所有模式。 在我希望得到类型A存在的所有模式的示例中,我想执行以下操作: hdfs dfs -ls /schemas_folder/date=*/A-schema.avsc 那会给我 Found 1 items -rw-r–r– 3 user group 1234 2014-01-01 12:34 /schemas_folder/date=20140101/A-schema.avsc Found 1 […]

为什么使用通配符捕获助手方法?

参考: 通配符捕获助手方法 它说要创建一个辅助方法来捕获通配符。 public void foo(List i) { fooHelper(i); } private void fooHelper(List l) { l.set(0, l.get(0)); } 仅在下面单独使用此函数不会产生任何编译错误,并且似乎以相同的方式工作。 我不明白的是:你为什么不使用这个并避免使用助手? public void foo(List l) { l.set(0, l.get(0)); } 我认为这个问题可以归结为:通配符和generics之间有什么区别? 所以,我去了这个: 通配符和generics之间的区别 。 它说要使用类型参数: 1)如果要对不同类型的方法参数强制实施某些关系,则不能使用通配符,必须使用类型参数。 但是,具有辅助函数的通配符实际上并不是这样吗? 是不是通过设置和获取未知值来强制执行不同类型的方法参数的关系? 我的问题是:如果你必须定义需要在不同类型的方法args上建立关系的东西,那么为什么首先使用通配符然后使用辅助函数呢? 这似乎是一种结合通配符的hacky方式。

Java中的通配符匹配

我正在编写一个简单的调试程序,它将输入简单的字符串作为输入,可以包含星号以指示通配符匹配 *.wav // matches .wav (*, a) // matches (, a) 我以为我会简单地使用该模式,在其中转义任何正则表达式特殊字符,然后将任何\\*替换回.* 。 然后使用正则表达式匹配器。 但我找不到任何Java函数来逃避正则表达式。 我能找到的最佳匹配是Pattern.quote ,然而它只是将\Q和\E放在字符串的开头和结尾。 Java中是否有任何东西可以让您简单地进行通配符匹配而无需从头开始实现算法?

Java:通配符类型不匹配导致编译错误

我在我的项目中创建了一个工厂类,它允许我(理论上)为任何(支持的)给定类型创建管理器。 与管理器交互允许我改变给定类型的某些属性。 我面临的问题是,当我尝试为generics类型创建一个管理器时,编译器会破坏我的希望和梦想。 以下代码是我正在使用的精简版本。 我尝试创建’test3Manager’的行不会编译,我试图理解为什么会这样。 它下面的行显示了一个’解决方法’,我试图避免。 import java.util.List; public class GenTest { public static void main(String[] args) { String test1 = “”; IRandomType test2 = null; IAnotherRandomType test3 = null; IManager test1Manager = Factory.createManager(test1); IManager<IRandomType> test2Manager = Factory.createManager(test2); IManager<IAnotherRandomType> test3Manager = Factory.createManager(test3); // Doesn’t compile. Why? // Work around? IManager test3ManagerTmp = Factory.createManager(test3); IManager<IAnotherRandomType> test3Manager2 […]

捕获Javagenerics中的通配符

从这个 Oracle Java教程: WildcardError示例在编译时产生捕获错误: public class WildcardError { void foo(List i) { i.set(0, i.get(0)); } } 在此错误演示之后,他们使用辅助方法解决了问题: public class WildcardFixed { void foo(List i) { fooHelper(i); } // Helper method created so that the wildcard can be captured // through type inference. private void fooHelper(List l) { l.set(0, l.get(0)); } } 首先,他们说列表输入参数( i )被视为一个Object : […]

Java嵌套通配符generics将无法编译

我在Javagenerics中遇到有界嵌套通配符的问题。 这是一个常见的情况: public void doSomething(Set set) {} public void callDoSomething() { Set set = new HashSet(); doSomething(set); } 这是标准的Javagenerics,工作正常。 但是,如果通配符变为嵌套,则它不再起作用: public void doSomething(Map<String, Set> map) {} public void callDoSomething() { Map<String, Set> map = new HashMap<String, Set>(); doSomething(map); } 这会导致编译器错误。 我尝试了各种演员表和通配符排列,但我无法使其正常工作。 我不记得以前看过这个问题了,多年来我一直在使用仿制药。 我是否太累了,错过了一些明显的东西?

无法实例化generics中的类型

我有这门课 public class Tree { //List of branches for this tree private List<Tree> branch = new ArrayList<Tree>(); public Tree(T t){ this.t = t; } public void addBranch(Tree src){ branch.add(src); } public Tree getBranch(int branchNum){ return (Tree) branch.get(branchNum); } private T t; } 我正在尝试使用此类创建一个变量 public static void main(String[] args){ Tree num2 = new Tree(2); } 它给了我这个错误 […]

多个嵌套通配符 – 不适用的参数

我大大简化了我的问题。 这是它的阅读方式。 我试图弄清楚为什么以下代码无法编译: List<AnonType<AnonType>> l = new ArrayList<AnonType<AnonType>>(); l.add( new AnonType<AnonType>() ); 哪里 public class AnonType { T a; List b; } 编译器错误表示add不适用于给定的参数。 OTOH,以下代码只有1级嵌套通配符完美编译: List<AnonType> l = new ArrayList<AnonType>(); l.add( new AnonType() );