我想要一个仅表示完成的CompletableFuture(例如,我没有返回值).
我可以将CompletableFuture实例化为:
CompletableFuture<Void> future = new CompletableFuture<> ();
Run Code Online (Sandbox Code Playgroud)
但是我应该为完整的方法提供什么?例如,我做不到
future.complete(new Void());
Run Code Online (Sandbox Code Playgroud) 我今天意识到这个编译并运行良好:
public class Test {
public static <T> T handle(T val) {
System.out.println("T");
return val;
}
public static <T extends String> T handle(T val) {
System.out.println("T extends String");
return val;
}
}
Run Code Online (Sandbox Code Playgroud)
这两个handle方法具有相同的名称,并且?参数的数量和类型()相同.唯一的区别是第二种handle方法具有更严格的通用界限.IDE根本没有抱怨,代码编译得很好.在运行时方法按预期选择 - 例如,Test.handle("this is a string")将调用第二个方法Test.handle(10)并将调用第一个方法.
泛型绑定是否被认为是方法签名的一部分?或者它是一种方法重载决议魔术?
当使用jib-gradle-plugin构建并推送到 AWS ECR 时,它要求我安装aws ecr 凭证助手,否则构建会抱怨“系统没有 docker-credential-ecr-login CLI”。
我想知道是否有一种方法可以在不安装凭证助手的情况下推送到 AWS ECR,或者是否可以在存储库中捆绑凭证助手的便携式版本?
安装助手的问题是:
我知道这不是 Jib 问题,但我只是希望使用 Jib 的人可能遇到类似的挑战,因此可以提供一些有关如何解决该问题的见解。
这可能是一个愚蠢的问题.我知道编译器将删除未使用的本地.但是,如果我像这样写我的代码:
class MyClass
{
public int SomeProperty
{
get
{
...
}
}
public void SomeFunction ()
{
//will this line be removed if i is never used?
int i = SomeProperty;
...
}
}
Run Code Online (Sandbox Code Playgroud)
我想知道如果i由于优化将被编译器删除.SomeProperty我希望执行的getter中有逻辑.如果i将被删除,我必须更改SomeProperty为一个功能.
顺便问一下,有没有办法知道哪一行会被编译器优化?
我在Internet和stackoverflow上进行了一些基本搜索,当涉及通用版本方法和非通用版本方法时,我看到了很多有关重载解析的讨论。我知道重载再分解是在编译时完成的-因此,如果我有以下代码:
public class A<T>
{
public void DoStuff(T value)
{
InternalDoStuff(value);
}
protected void InternalDoStuff(int value)
{
Console.WriteLine("Non-generic version");
}
protected void InternalDoStuff(T value)
{
Console.WriteLine("Generic version");
}
}
public class Test
{
static void Main (string [] args)
{
A<int> a = new A<int> ();
a.DoStuff(100);
}
}
Run Code Online (Sandbox Code Playgroud)
输出将是“通用版本”,因为编译器已经选择了“ InternalDoStuff”的分辨率,并且编译器看到的是“在DoStuff中使用T类型参数调用了InternalDoStuff”。
但是我不知道这是否会有所作为:
public class B : A <int>
{
}
public class Test
{
static void Main (string [] args)
{
B b = new B ();
b.DoStuff(100);
}
} …Run Code Online (Sandbox Code Playgroud) 我试图使用Class.cast()将盒装Double转换为原始double:
Object d = 1.0d;
Class<?> clazz = double.class;
//the bellow line throws java.lang.ClassCastException:
//Cannot cast java.lang.Double to double
clazz.cast(d);
Run Code Online (Sandbox Code Playgroud)
我这样做是因为在我的代码的某些部分,动态地给出了一个值对象和一个类,并且我确实保证值对象是兼容类型.但是这个例外让我很困惑.使用cast()的合同是什么?
更新我遇到了这个,因为我们的代码如下:
interface Provider <T> {
T get ();
Class<T> getClazz();
}
//a special handling for double primitive
class DoubleProvider implements Provider<Double> {
public double getDouble(){
return 1.0d;
}
@Override
public Double get() {
return getDouble();
}
@Override
public Class<Double> getClazz() {
//why this actually compiles?
return double.class;
}
}
Run Code Online (Sandbox Code Playgroud)
如果double和Double是如此不同以至于它们都不被认为是可分配的,为什么java允许DoubleProvider中的getClazz()方法进行编译?double.class和Double.class之间的关系是什么?