는, 나는 두 번째는 분명히 처음의 덜 제한적인 버전이기 때문에이러한 변환 불가능한 유형을 변환 할 수있는 방법이 있습니까? 언뜻
ArrayList<Class<?>>
에
ArrayList<Class<? extends Interface1>>
을 시전 할 수있을 것으로 기대했을 것이다.
import java.util.ArrayList;
public class TypeInvocationConversionTest
{
private static ArrayList<Class<? extends Interface1>> classList;
private static ArrayList<Class<?>> lessRestrictiveClassList;
public static void main(String[] args)
{
classList = new ArrayList<Class<? extends Interface1>>();
lessRestrictiveClassList = (ArrayList<Class<?>>) classList;
}
private interface Interface1 {}
}
을하지만
TypeInvocationConversionTest.java:12: inconvertible types
found : java.util.ArrayList<java.lang.Class<? extends TypeInvocationConversionTest.Interface1>>
required: java.util.ArrayList<java.lang.Class<?>>
lessRestrictiveClassList = (ArrayList<Class<?>>) classList;
^
내가 그것을이 두 형식을 변환하려는 무리한 생각하지 않는 오류가 발생합니다 : 그러나 다음 코드는 컴파일되지 않습니다 동기 부여, 여기에 간단한 프로그램입니다 실제로 취급하고있는 무슨에 가까운 (이 코드는를 컴파일되지 않습니다) :
import java.util.ArrayList;
public class Mammal
{
public void produceMilk() {}
}
public class Reptile
{
public void layEggs() {}
}
public interface Species
{
String getSpeciesName();
}
public class Dog extends Mammal
implements Species
{
@Override
public String getSpeciesName()
{
return "Canis lupus familiaris";
}
}
public class Cat extends Mammal
implements Species
{
@Override
public String getSpeciesName()
{
return "Feles catus";
}
}
public class Boa extends Reptile
implements Species
{
@Override
public String getSpeciesName()
{
return "Boa constrictor";
}
}
public class Panel3 extends Reptile
implements Species
{
@Override
public String getSpeciesName()
{
return "Dromiceiomimus brevitertius";
}
}
public class AnimalFunTime
{
public static void main(String[] args)
{
ArrayList<Class<? extends Mammal>> listOfMammals;
ArrayList<Class<? extends Reptile>> listOfReptiles;
ArrayList<ArrayList<Class<?>>> matrixOfAnimals;
listOfMammals.add(Dog.class);
listOfMammals.add(Cat.class);
listOfReptiles.add(Boa.class);
listOfReptiles.add(Panel3.class);
///////////////////////////////////////////////////////////////////////////
// The following two lines cause an error. //
///////////////////////////////////////////////////////////////////////////
matrixOfAnimals.add((ArrayList<Class<?>>) listOfMammals);
matrixOfAnimals.add((ArrayList<Class<?>>) listOfReptiles);
// Get milk.
for (int i = 0 ; i < listOfMammals.size() ; i++) {
listOfMammals.get(i).produceMilk();
}
// Get eggs.
for (int i = 0 ; i < listOfReptiles.size() ; i++) {
listOfReptiles.get(i).layEggs();
}
// Display all the animals' names.
for (int j = 0 ; j < matrixOfAnimals.size() ; j++) {
ArrayList<Class<?>> currentFamily = matrixOfAnimals.get(j);
for (int i = 0 ; i < currentFamily.size() ; i++) {
Class<?> currentAnimal = currentFamily.get(i);
if (Species.isAssignableFrom(currentAnimal) {
System.out.println(currentAnimal.getSpeciesName());
}
else
{
throw new SpeciesNotImplementedException("Please tell us the animal's name!");
}
}
}
}
}
을 주석이 말한대로,이 코드 미상 ArrayList<Class<? extends Mammal>>
및 ArrayList<Class<? extends reptile>>
개체가 모두 포함 된 목록을 만들 수 없기 때문에 컴파일되지 않습니다. 만약 그 두 가지를 모두 ArrayList<Class<?>>
s로 캐스팅 할 수 있다면 괜찮을 것입니다. 이런 일을 할 수 있도록 캐스트를 할 수있는 방법이 있습니까?
일반형으로 만들기 –
이미 꽤 일반적으로 보입니다! 제네릭을 어떻게 만들어야합니까? –