gpt4 book ai didi

java - 使用泛型的可重用接口(interface)

转载 作者:行者123 更新时间:2023-11-30 05:57:56 24 4
gpt4 key购买 nike

我想创建一个类来引用使用接口(interface)的服务类型。该服务可以有不同的实现。不同的实现将处理不同类型的请求。过去我会定义一个像这样的接口(interface):

public interface I_Test
{
public String get(String key, Enum type);
}

并像这样实现它:

public class Test_1 implements I_Test
{
public String get(String key, Enum type)
{
Enum_1 t1 = (Enum_1)type;

switch(t1)
{
case NAME:
return "Garry";
case DOB:
return "1966";
default:
throw new IllegalArgumentException("Unkown type [" + type + "]");
}
}
}

好处是我可以使用不同的接口(interface)实现来满足不同的需求。不好的是我必须进行类型转换,因此在运行时存在风险。

我希望泛型可以解决这个问题,所以我这样做了:

public interface I_Test<T extends Enum>
{
public String get(String key, T type);
}

还有这个:

public class Test_1 implements I_Test<Enum_1>
{
public String get(String key, Enum_1 type)
{
switch(type)
{
case NAME:
return "Garry";
case DOB:
return "1966";
default:
throw new IllegalArgumentException("Unkown type [" + type + "]");
}
}
}

但是当我去使用这个东西时,我会收到类型安全警告,除非我用我打算使用的类型声明我的变量,如下所示:

I_Test<Enum_1> t1 = new Test_1();

这确实让我烦恼,因为创建 I_Test 接口(interface)的全部目的是为了让我可以使用不同的实现,但似乎我必须在编译时锁定特定类型以避免此警告!

有没有办法编写一个使用泛型的可重用接口(interface),而没有这个烦人的警告?

最佳答案

泛型的目的是确保您的代码更可靠(就类型安全而言)。使用泛型,您可以在编译时而不是运行时找出类型不兼容性。当您将接口(interface)定义为I_Test<T extends Enum>时,您基本上是说您确实需要根据特定类型对接口(interface)进行泛型化。这就是 Java 向您发出警告的原因。

如果您执行类似 Map myMap = new HashMap<string>(); 的操作,您会收到相同的警告.

在 Java 中,您实际上指定了类型,并且它们不是从 RHS 上的内容推断出来的(除非您执行类似 Integer i = 1 的操作,但这是自动装箱)。由于您泛化了接口(interface),因此当您使用该接口(interface)声明某些内容时,您需要指定要使用的类型(泛型化)。

当您实例化泛型类型时,编译器将使用所谓的“类型删除”来转换这些类型。在这里,编译器删除与类型参数和类型实参关联的所有信息。 Java 这样做是为了保持与 Java 拥有泛型之前编写的旧代码的兼容性。

所以I_Test<Enum_1>实际上被翻译为原始类型 I_Test编译期间。使用原始类型通常被认为是一种不好的做法(因此,“烦人的警告”)。编译器告诉您它没有足够的信息来执行类型检查,因此无法确保类型安全(因为您使用了原始类型)。

要了解有关泛型的更多信息,请查看以下内容:

关于java - 使用泛型的可重用接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4925163/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com