繁体   English   中英

是否可以从 Java 的 object 构造函数中删除泛型类型参数?

[英]Is is possible to remove generic type parameters from object constructor in Java?

在 Java 中,不得不写:

Pair<String, String> pair = new Pair<String, String>("one", "two");

如果为您推断类型会很好,这样您至少可以这样做:

Pair<String, String> pair = new Pair("one", "two");

并再次跳过通用参数。

您可以制作一个 static 方法,可以像这样作弊:

public static <T, S> Pair<T, S> new_(T one, S two) {
    return new Pair<T, S>(one, two);
}

然后像这样使用它: Pair.new_("one", "two")

是否可以将类型推断构建到构造函数中以避免黑客攻击?

我在想类似的东西:

public <S,T> Pair(S one, T two) {
    this.one = one;
    this.two = two;
}

但是随后您会遇到泛型类型冲突。 有人有想法吗?

通常有一个辅助方法会为您暗示类型。

Pair<String, String> pair = Pair.of("one", "two");

那么它似乎不像这样的黑客。

如果 Java 有一个内置对 class 也很好。 ;)

在 Java 7 中,您可以使用“钻石”运算符:

List<String> strings = new ArrayList<>();

Map<String, Int> map = new HashMap<>();

Map<String, List<String>> lolmap = new HashMap<>();

问题在于,特定类型的变量的声明和由该变量引用的 object 的实例化是两个不同的操作。 字符串通常很难出错,但假设您正在设置数字对(可能是 XY 坐标):

Pair<float,float> myCoords = new Pair(3,4);

这带来了一个难题; 您正在声明一个Pair<float, float> ,但分配一个 object 可能会被推断为Pair<int,int> ,除非编译器有足够的智能来考虑在推断时设置的变量的类型实例化对象的泛型类型(极不可能)。 Java generics,AFAIK,不是协变的,即使它们是协变的,int 也不会从 float 继承。 我不知道有一种非鸭子类型的语言可以正确处理这种情况。

我知道这很累,但这样可以确保代码的类型安全。 此代码是合法的 Java 代码(尽管来自编译器的警告):

import java.util.*;

public class Main {
  public static void main(String[] args) {
    ArrayList a = new ArrayList();
    a.add(1);
    ArrayList<String> b = a;
    System.out.println(b.get(0));
  }
}

但是编译器现在无法推断类型,但是 a 是与 b 兼容的赋值。 尝试运行它,会出现运行时错误。

我更喜欢明确的事情。 当事物被推断出来时,它们可能被错误地推断出来,或者方法可能在没有任何通知的情况下被错误地使用,因为系统推断出如何处理不正确的arguments。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM