在Scala中,从增量编译器(sbt,Eclipse中的sbt,IntelliJ)的功效和速度的角度来看,使用通配符导入是不是很糟糕?是否会对这些增量编译器决定在更改时重新编译的内容的方式产生负面影响?
例如,如果对于一个新类X,我只需要从包中导入类A和B(而不是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?
我在铸造仿制药时发现了一种奇怪的情况.我运行这段代码:
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允许我做这样的事情?我B在As 列表中添加了一个类实例?
这是非常糟糕的泛型行为.为什么会这样?
顺便说一下,我用Java 7尝试过.
编辑:
让我感到惊讶的是,Java只通知问题,并警告每个程序员都可以忽略它.我知道这SuppressWarnings是个坏主意,但为什么Java没有拒绝这样的错误或异常行为?
此外,这个警告始终显示,如果你认为你的演员是正确的,你别无选择,只能忽略它.但是,如果你认为这是好的铸造并忽略它但不是吗?
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.
在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>?还有什么好处?
如何匹配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_1来New_Space_11.
不要New_Space_SomeString和New_Space_SomeString1
我有这样的问题.
SELECT SpaceName FROM SpaceTable
WHERE SpaceName LIKE 'New_Space_%'
Run Code Online (Sandbox Code Playgroud)
但这会返回所有记录.
好的,所以情况就是这样.我有一个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) 我正在努力解决这个问题,并且想知道是否有人可以解释原因.
我有三个班:员工,人和天使.
员工延伸人和人延伸天使.
当我尝试执行此代码时
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的超类)并且应该被允许?显然不是!
有没有人有任何简单的例子?
假设我想在do-notation块中分叉一个线程,但我不关心线程id.如果我写
forkIO action
Run Code Online (Sandbox Code Playgroud)
GHC发出警告
警告:
do-not语句丢弃了类型的结果ThreadId.说出这个警告Run Code Online (Sandbox Code Playgroud)_ <- forkOS action
这是一个好主意,因为我想表明该程序正在丢弃某些结果.但是,这样一来,丢弃的东西就不明显了.我可以写
threadId <- forkIO action
Run Code Online (Sandbox Code Playgroud)
但后来我们隐瞒了我们不会threadId在任何地方使用的事实,GHC正确警告
警告:已定义但未使用:
threadId
似乎前置下划线解决了这两个问题:
_threadId <- forkIO action
Run Code Online (Sandbox Code Playgroud)
我的问题是:根据Haskell的语言规范,使用以下划线开头的变量是合法的吗?它有多便携?它在某处记录了吗?是否鼓励这样的案例 - 记录结果被忽略?
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秒)......
人们可以注意到它 …
给出以下两个类定义:
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>,似乎没有解决方案可以通过与上述相同的推理得出.
wildcard ×10
java ×5
generics ×4
c# ×1
hadoop ×1
haskell ×1
hdfs ×1
import ×1
inheritance ×1
mysql ×1
optimization ×1
portability ×1
scala ×1
sql ×1
sql-server ×1
syntax ×1