标签: wildcard

在增量编译方面Scala中的通配符导入是不是很糟糕?

在Scala中,从增量编译器(sbt,Eclipse中的sbt,IntelliJ)的功效和速度的角度来看,使用通配符导入是不是很糟糕?是否会对这些增量编译器决定在更改时重新编译的内容的方式产生负面影响?

例如,如果对于一个新类X,我只需要从包中导入类AB(而不是C)pack,我是否会因此而受到惩罚:

import pack._
Run Code Online (Sandbox Code Playgroud)

而不是这个?

import pack.{ A, B }
Run Code Online (Sandbox Code Playgroud)

假设A并且B不依赖于C,将X使用通配符导入重新编译,而不是在C更改时使用更具体的导入,或者依赖关系跟踪系统是否足够智能以实现尽管通配符导入C未使用X

import scala wildcard incremental-compiler

16
推荐指数
1
解决办法
799
查看次数

使用Java编译泛型列表

我在铸造仿制药时发现了一种奇怪的情况.我运行这段代码:

class A { }

class B { }

public class Program {

    @SuppressWarnings("unchecked")
    public static void main(String[] args) {
        List<A> listA = new ArrayList<A>();
        List<?> list = listA;
        ((List<B>)list).add(new B());

        for (Object item : listA) {
            System.out.println(item.toString());
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

它编译得非常好(只有警告但没有错误)并且没有任何异常运行,输出为:

乙@ 88140ed

我是怎么做到的?我的意思是为什么Java允许我做这样的事情?我BAs 列表中添加了一个类实例?

这是非常糟糕的泛型行为.为什么会这样?

顺便说一下,我用Java 7尝试过.

编辑:
让我感到惊讶的是,Java只通知问题,并警告每个程序员都可以忽略它.我知道这SuppressWarnings是个坏主意,但为什么Java没有拒绝这样的错误或异常行为?

此外,这个警告始终显示,如果你认为你的演员是正确的,你别无选择,只能忽略它.但是,如果你认为这是好的铸造并忽略它但不是吗?

java generics wildcard

16
推荐指数
2
解决办法
1056
查看次数

Optimization of MySQL search using "like" and wildcards

How can queries like

SELECT * FROM sometable WHERE somefield LIKE '%value%'
Run Code Online (Sandbox Code Playgroud)

be optimized?

The main issue here is the first wildcard which prevents DBMS from using index.

Edit: What is more, somefield value is solid string (not a piece of text) so fulltext search could not be performed.

mysql optimization wildcard

15
推荐指数
3
解决办法
1万
查看次数

Collections.min/max方法的签名

在Java中,Collections类包含以下方法:

public static <T extends Object & Comparable<? super T>> T min(Collection<? extends T> c)
Run Code Online (Sandbox Code Playgroud)

它的签名因其对泛型的高级使用而闻名,因此在Java的Nutshell书籍和官方的Sun Generics Tutorial中都提到了它.

但是,我无法找到以下问题的令人信服的答案:

为什么类型的形式参数Collection<? extends T>,而不是Collection<T>?还有什么好处?

java generics wildcard

15
推荐指数
2
解决办法
1577
查看次数

SQL Server中的数字通配符

如何匹配SQL Server"LIKE"中的数字.

SpaceName
------------ 
| New_Space_1
| .
| .
| New_Space_8 
| New_Space_9
| New_Space_10
| New_Space_11
| New_Space_SomeString
| New_Space_SomeString1
Run Code Online (Sandbox Code Playgroud)

以上是我的表格内容.我想只获得以Numeric字符结尾的记录,即我想要记录New_Space_1New_Space_11.

不要New_Space_SomeStringNew_Space_SomeString1

我有这样的问题.

SELECT SpaceName FROM SpaceTable
    WHERE SpaceName LIKE 'New_Space_%' 
Run Code Online (Sandbox Code Playgroud)

但这会返回所有记录.

sql sql-server wildcard sql-server-2008

15
推荐指数
2
解决办法
4万
查看次数

C#通用通配符或如何保存对未知通用继承的引用

好的,所以情况就是这样.我有一个FlexCollection<T>课程,其目的是保留一些专业的清单FlexItem,因此:

public class FlexCollection<T> where T : FlexItem, new()
{
    public void Add(T item) { ... }
    ...
}
Run Code Online (Sandbox Code Playgroud)

FlexItem不是泛型类本身.我想要实现的是能够在FlexItem字段中保存对包含该对象的集合的引用.不幸的是,在C#中,不可能引用模板类的"任何"特化(如在Java中).起初我尝试使用非泛型接口,IFlexCollection但它实际上迫使我实现每个方法两次,即:

public class FlexCollection<T> : IFlexCollection where T : FlexItem, new()
{
    public void Add(T item) { ... } // to use in generic calls
    public void Add(object item) { ... } // to use for calls from within FlexItem
    ...
}
Run Code Online (Sandbox Code Playgroud)

然后我发现我可以让FlexItem成为一个通用类本身!然后专门化可以包含对此专业化对象集合的引用(这是非常合乎逻辑的).因此:

public class FlexItem<T> where T : FlexItem<T>, new()
{ …
Run Code Online (Sandbox Code Playgroud)

c# generics inheritance wildcard

15
推荐指数
1
解决办法
1379
查看次数

Java下界通配符

我正在努力解决这个问题,并且想知道是否有人可以解释原因.

我有三个班:员工,人和天使.

员工延伸人和人延伸天使.

当我尝试执行此代码时

class Angel {}
class Person extends Angel {}
class Employee extends Person {}
Run Code Online (Sandbox Code Playgroud)

我收到一个错误:

在类型List中添加(捕获#5-of?super Person)的方法不适用于参数(Angel)

我一直在阅读文档<? super X >意味着任何类型的X或X的超类(所以在我的情况下,Angel是Person的超类)并且应该被允许?显然不是!

有没有人有任何简单的例子?

java wildcard

15
推荐指数
2
解决办法
4946
查看次数

是否使用以"_"(下划线)开头的模式名称来记录/鼓励/可移植的忽略结果?

假设我想在do-notation块中分叉一个线程,但我不关心线程id.如果我写

forkIO action
Run Code Online (Sandbox Code Playgroud)

GHC发出警告

警告:do-not语句丢弃了类型的结果ThreadId.说出这个警告

_ <- forkOS action
Run Code Online (Sandbox Code Playgroud)

这是一个好主意,因为我想表明该程序正在丢弃某些结果.但是,这样一来,丢弃的东西就不明显了.我可以写

threadId <- forkIO action
Run Code Online (Sandbox Code Playgroud)

但后来我们隐瞒了我们不会threadId在任何地方使用的事实,GHC正确警告

警告:已定义但未使用: threadId

似乎前置下划线解决了这两个问题:

_threadId <- forkIO action
Run Code Online (Sandbox Code Playgroud)

我的问题是:根据Haskell的语言规范,使用以下划线开头的变量是合法的吗?它有多便携?它在某处记录了吗?是否鼓励这样的案例 - 记录结果被忽略?

syntax portability haskell wildcard pattern-matching

15
推荐指数
1
解决办法
1714
查看次数

列出API调用的Hadoop文件系统中的通配符

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
Run Code Online (Sandbox Code Playgroud)

就我而言,该目录在不同日期存储不同类型数据(本例中A,B和C)的Avro模式.随着时间的推移,模​​式可能会开始存在,发展并停止存在.


目标

我需要能够尽快获得给定类型的所有模式.在我希望得到类型A存在的所有模式的示例中,我想执行以下操作:

hdfs dfs -ls /schemas_folder/date=*/A-schema.avsc
Run Code Online (Sandbox Code Playgroud)

那会给我

Found 1 items
-rw-r--r--   3 user group 1234 2014-01-01 12:34 /schemas_folder/date=20140101/A-schema.avsc
Found 1 items
-rw-r--r--   3 user group 2345 2014-01-02 23:45 /schemas_folder/date=20140102/A-schema.avsc
Run Code Online (Sandbox Code Playgroud)

问题

我不想使用shell命令,似乎无法在Java API中找到与上面的命令等效的东西.当我尝试自己实现循环时,我的表现非常糟糕.我至少想要命令行的性能(在我的情况下大约3秒)......


到目前为止我发现了什么

人们可以注意到它 …

java hadoop wildcard hdfs

15
推荐指数
1
解决办法
1万
查看次数

捕获Java中的转换问题,JLS的WRT协调和实际的JDK行为

给出以下两个类定义:

class C1<T extends C1<T>> {}

class C2<U> extends C1<C2<U>> {}
Run Code Online (Sandbox Code Playgroud)

请考虑以下类型声明:

C1<? extends C2<String>> c;
Run Code Online (Sandbox Code Playgroud)

这将编译在JDK-8u45好的,但如果我们考察了采集转换规范,它出现(我)这个声明应该导致编译时错误.

特别是,新类型变量捕获的上限由下式T#1给出glb(Bi, Ui[A1:=S1,...,An:=Sn]),在这种情况下,Bi解析为通配符绑定C2<String>Ui[A1:=S1,...,An:=Sn]解析为C1<T#1>.

由此,glb(C2<?>, C1<T#1>)解析为交叉点型C2<String> & C1<T#1>,这是无效的,因为C2<String>C1<T#1>都是类类型,而不是接口类型,但其中没有一个是另一个的子类型.

这种(明显的)规则违规可能在交集类型本身的定义中更加清晰.

我确定这不是一个错误,我只是在某个地方犯了一些简单的错误...... 如果它是一个bug,我希望它可以被认为是JLS中的错误而不是JDK,这样我可以期望能够安全地模拟行为......

谢谢你的帮助!

编辑:有Radiodef昨天交谈后我说服自己,这个问题(或者看它单程至少)是C2<String> 能有效地被认为是作为一个亚型C1<T#1>,因为T#1只能永远被满足C2<String>,因此可被认为是相同的,但是遏制和子类型规则并没有像写的那样理解这种关系,因此JLS不会识别子类型并且应该失败......

但是,如果你采取稍微复杂的情况C1<? extends C2<?>> d;,那就更棘手了.问题是类似的,但是形成捕获上限的交集类型出现了C2<?> & C1<T#2>,似乎没有解决方案可以通过与上述相同的推理得出.

java generics compiler-errors wildcard

15
推荐指数
1
解决办法
329
查看次数